声明Lua函数并使用正确的名称引用
以下Lua脚本在功能范围方面有什么不同。在其他一些Lua脚本中,声明Lua函数并使用正确的名称引用,lua,Lua,以下Lua脚本在功能范围方面有什么不同。在其他一些Lua脚本中,require'calculator'的需求会受到什么影响。在aLuaState.getGlobal(function\u name)中如何引用它。它的正确函数名是什么?还有对声明方法的优点/缺点的任何评论 A) 计算器 function foo(n) return n+1; end calc= {} function calc.foo(n) return n+1; end function foo(n)
require'calculator'
的需求会受到什么影响。在aLuaState.getGlobal(function\u name)
中如何引用它。它的正确函数名是什么?还有对声明方法的优点/缺点的任何评论
A) 计算器
function foo(n)
return n+1;
end
calc= {}
function calc.foo(n)
return n+1;
end
function foo(n)
return n+1;
end
function calculator()
calc = {}
calc.foo=foo
return calc
end
B) 计算器
function foo(n)
return n+1;
end
calc= {}
function calc.foo(n)
return n+1;
end
function foo(n)
return n+1;
end
function calculator()
calc = {}
calc.foo=foo
return calc
end
C) 计算器
function foo(n)
return n+1;
end
calc= {}
function calc.foo(n)
return n+1;
end
function foo(n)
return n+1;
end
function calculator()
calc = {}
calc.foo=foo
return calc
end
我不知道你所说的这些脚本的“范围”到底是什么意思。这些脚本的具体功能取决于它们的执行方式。你可以给他们一个不同的环境,从而改变他们所认为的“全球人” 因此,我将根据您使用
dofile
、dostring
等加载脚本的假设来解释这些脚本的作用。也就是说,您正在将它们应用到全球环境中
(A)
这将创建一个全局变量,foo
,它是一个函数
(B)
这将创建一个全局变量,calc
,它是一个表。此表只有一个条目,其键为foo
,其值是一个函数
(C)
这将创建两个全局变量foo
是一个函数<代码>计算器也是一个函数。每次调用calculator
都会导致覆盖全局变量calc
。calc
的新值将是一个具有单个条目的表,其键为foo
,其值是全局变量foo
中存储内容的副本
很难说方法C的“优点”是什么,因为它毫无意义。它创建两个函数而不是一个,第二个函数不断创建新表
B只是a的一个“名称空间”范围的版本。Lua模块的一般期望是,包括它们通常会创建一些包含该模块中所有函数的表,以避免名称与现有全局状态冲突。在这方面,B可能更好。但这主要取决于这个脚本的用途
就我个人而言,对于简单的shell脚本和实用程序脚本,我不需要进行适当的模块范围划分。当我制作一个合适的模块时,我通常使用Lua函数。不完全是一个答案,而是一个语义注释-在Lua中,你不声明一个函数,你创建它。函数(…)在
函数时变为可用。。。执行结束
。它的可用性取决于存储位置
你必须记住:
function myfun(foo) print('foo') end
只是语法糖:
myfun = function(foo) print('foo') end
如果不执行任何特殊操作,myfun
将成为存储在全局状态中的全局变量(可通过\G
访问)。如果在实际调用函数myfun()end
之前说local myfun
,则函数(实际上是a)将存储在局部变量中,并且仅在局部变量的范围内可用
如果使用require
,它只会找到文件并加载一次。它不会对模块做任何花哨的事情,比如隐藏全局变量等。因此,如果您在模块Calculator.lua
中编写function foo()end
,然后调用require'Calculator'
将在globalfoo
中创建一个函数,您可以使用LuaState.getGlobal(“foo”)
访问该函数。如果创建函数表(步骤B),则必须使用两个步骤:
L.getGlobal("calc") -- pushes the "calc" global (a table) to the stack
L.getField(-1, "foo") -- gets the "foo" field from the table