我正在使用准模块方法"从表中 - 在内部使用本地",如本页所述.
local M = {}
-- private
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
Run Code Online (Sandbox Code Playgroud)
但是,在定义函数后,我不会向模块表中添加函数等.相反,我在文件的底部做.
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
Run Code Online (Sandbox Code Playgroud)
可以清楚地看到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,
}
Run Code Online (Sandbox Code Playgroud)
是等价的.我想,如果我在另一个模块中使用这个模块,那么返回的表是全局的但是afaik
local foo = require 'foomodule'
Run Code Online (Sandbox Code Playgroud)
它不会产生任何影响(性能),因为我将局部变量绑定foo到返回的表.
简短版本:所有这些代码片段都是等效的.
显然,全局模块表的创建取决于用户编写模块.require"foomodule"正确加载模块,但它不会foomodule在globals表中创建表_G.它确实在package.loaded中创建了一个模块表.
所以基本上它是你的选择:
require "foomodule"创建全局foomodule表在我看来,选项2是首选,因为它不会意外毁坏与您的模块同名的用户表,或者至少他知道如果他看到他正在擦除他的表foo = require'...'.然而,似乎大多数模块使用第一种方法,只是希望不会发生这个问题.
至于当地人,这很简单,本地人是当地人;).因此,如果您声明一个本地,它只在声明的范围内可用(请参阅参考手册中的第2.6节:可见性).