Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
声明Lua函数并使用正确的名称引用_Lua - Fatal编程技术网

声明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)

以下Lua脚本在功能范围方面有什么不同。在其他一些Lua脚本中,
require'calculator'
的需求会受到什么影响。在a
LuaState.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'
将在global
foo
中创建一个函数,您可以使用
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