有关模块/require的Lua作用域问题。

我正在使用“从表格 - 在本地内部使用”的准模块方法,正如此页面中所述:http://lua-users.org/wiki/ModuleDefinition。

local M = {}

- 私有的
local x = 1
local function baz() print 'test' end

local function foo() print("foo", x) end
M.foo = foo

local function bar()
  foo()
  baz()
  print "bar"
end
M.bar = bar

return M

然而,我没有在函数定义之后将函数等添加到模块表中。相反,我在文件底部完成它们的添加。

local x = 1
local function baz() print 'test' end

local function foo() print("foo", x) end

local function bar()
  foo()
  baz()
  print "bar"
end

local M = {
  bar = bar,
  foo = foo,
}
return M

可以清楚地看出M是局部变量。我想知道

local x = 1
local function baz() print 'test' end

local function foo() print("foo", x) end

local function bar()
  foo()
  baz()
  print "bar"
end

return {
  bar = bar,
  foo = foo,
}

是否相同。我想返回的表格是全局的,但是我知道如果我像这样在另一个模块中使用此模块

local foo = require 'foomodule'

它不会有任何区别(在性能方面),因为我将局部变量foo绑定到返回的表中。

原文链接 https://stackoverflow.com/questions/5002864

点赞
stackoverflow用户513763
stackoverflow用户513763

短版本:所有这些代码片段是等价的。

显然,创建全局模块表取决于编写模块的用户。require "foomodule" 可以正确加载模块,但它不会在全局表 _G 中创建 foomodule 表。它确实在 package.loaded 中创建一个模块表。

因此,基本上是你的选择:

1.在你的模块中生成全局模块表,只需 require "foomodule" 将创建全局 foomodule 表

2.将决策留给用户:像第三个代码片段中那样,只返回一个未命名的表。

我认为,选项 2 更可取,因为它不会意外破坏用户与你的模块同名的表,或者至少他会知道如果看到 foo = require'...' 就意味着他正在抹掉自己的表。然而,似乎大多数模块使用第一种方法,只是希望这个问题不会发生。

至于局部变量,很简单,局部变量只是局部变量。所以如果你声明一个局部变量,它只在它声明的作用域中可用(参见2.6节:可见性的参考手册)。

2011-02-15 11:33:23