以下Lua脚本在功能范围方面有什么区别。它将如何影响其他Lua脚本中require 'calculator'
的需要。如何用LuaState.getGlobal(function_name)
来引用它。它的正确功能名称是什么?关于声明的优点/缺点的任何评论都会接近。
A)Calculator.lua
function foo(n)
return n+1;
end
B)Calculator.lua
calc= {}
function calc.foo(n)
return n+1;
end
C)Calculator.lua
function foo(n)
return n+1;
end
function calculator()
calc = {}
calc.foo=foo
return calc
end
答案 0 :(得分:2)
我不知道这些脚本的“范围”究竟是什么意思。这些脚本究竟做了什么取决于它们的执行方式。你可以给他们一个不同的环境,从而改变他们所认为的“全局”。
因此,我将基于您使用dofile
,dostring
或类似内容加载它们的假设来解释每个脚本的功能。也就是说,您将它们应用于全球环境。
A)
这会创建一个全局变量foo
,这是一个函数。
B)
这会创建一个全局变量calc
,它是表。此表有一个条目,键为foo
,其值为函数。
C)
这会创建两个全局变量。 foo
是一个功能。 calculator
也是一个功能。每次调用calculator
都会导致全局变量calc
被覆盖。 calc
的新值将是一个包含单个条目的表,其中键为foo
,其值是存储在全局变量foo
中的内容的副本。
很难说方法 C 的“优点”是什么,因为它没有意义。它创建了两个函数而不是一个函数,第二个函数不断创建新表。
B 只是 A 的“命名空间”范围版本。 Lua模块的一般期望是包含它们通常会创建一个包含该模块中所有函数的表,以避免名称与现有全局状态冲突。在这方面, B 可能会更好。但这主要取决于这个脚本将用于什么。
就个人而言,对于简单的shell脚本和实用程序脚本,我不打扰正确的模块范围。当我做一个合适的模块时,我通常使用module
Lua函数。
答案 1 :(得分:2)
不完全是一个答案,而是对语义的评论 - 在Lua中,你没有声明一个函数,你创建它。该功能在function(...) ... end
执行时可用。它的可用性取决于您存储它的位置。
你必须记住:
function myfun(foo) print('foo') end
只是语法糖:
myfun = function(foo) print('foo') end
如果您没有做任何特殊事情,myfun
将成为存储在全局状态中的全局变量(可通过_G
访问)。如果在实际调用local myfun
之前说function myfun() end
,则函数(实际上是closure)将存储在局部变量中,并且仅可用于局部变量的范围。
如果您使用require
,它只会找到该文件并加载一次。它不会像隐藏全局变量那样对模块执行任何操作等等。因此,如果在模块function foo() end
中编写Calculator.lua
,则调用require 'Calculator'
将在全局{{1}中创建一个函数您可以使用foo
进行访问。如果您创建一个功能表(步骤 B ),则必须使用两个步骤:
LuaState.getGlobal("foo")