Functional programming 命名函数和;匿名函数(Lua)
这些Functional programming 命名函数和;匿名函数(Lua),functional-programming,lua,Functional Programming,Lua,这些myFuncs之间有什么区别 代码1 function wrapper() local someVariable = 0; function myFunc(n) if n > 0 then return myFunc(n-1) end end return myFunc; end 代码2 function wrapper() local someVariable = 0; local myFunc = function(
myFunc
s之间有什么区别
代码1
function wrapper()
local someVariable = 0;
function myFunc(n)
if n > 0 then return myFunc(n-1) end
end
return myFunc;
end
代码2
function wrapper()
local someVariable = 0;
local myFunc = function(n)
if n > 0 then return myFunc(n-1) end
end
return myFunc;
end
代码3
function wrapper()
local someVariable = 0;
local myFunc;
myFunc = function(n)
if n > 0 then return myFunc(n-1) end
end;
return myFunc;
end
因为当我在
myFunc
本身中引用函数名myFunc
时。他们的行为不一样。(例如,upvaluesomeVariable
…有问题的:-S)[编辑:我误读了你的代码#2。]
代码#1为函数设置myFunc
的全局值。因此,每次调用包装器
,都会将这个全局值设置为一个新值。此外,对myFunc
调用的任何引用都将指向此全局(可修改),而不是本地(将是闭包的一个向上值)
代码#2设置一个局部变量myFunc
但是,由于Lua的规则,该局部变量只有在定义它的语句完成后才进入作用域。这允许您执行以下操作:
local x = x or 5
表达式中的x
是先前声明的局部或全局表达式。新的x
在对x或5
表达式求值之后才进入范围
函数定义也是如此。因此,对myFunc
的任何引用都将是全局变量,而不是局部变量
代码#3创建一个局部变量myFunc
。然后,它在该变量中设置一个函数。由于函数是在局部变量进入作用域后创建的,因此函数中对myFunc
的引用将引用局部变量,而不是全局变量
请注意,
local function X
相当于local X;X=功能…
不是到本地X=函数…
尼科尔的答案基本上是正确的,但有一点值得指出:
在代码2MyFunc
中,它不需要是全局变量,它可以是某个外部作用域中的局部变量,这将成为您正在创建的此函数的upvalue(相同的注释也适用于代码1)。例如,这将打印100
:
local function myFunc(n) return 100 end
function wrapper()
local someVariable = 0;
local myFunc = function(n)
if n > 0 then return myFunc(n-1) end
end
return myFunc;
end
print(wrapper()(1))
总之,有四种方法可以用来定义myFunc:
localmyfunc;myFunc=函数(n)。。。返回myFunc(n-1)结束
局部函数myFunc(n)。。。返回myFunc(n-1)结束
local myFunc=函数(n)。。。返回myFunc(n-1)结束
myFunc=函数(n)。。。返回myFunc(n-1)结束
1和2是完全等效的。3不会执行您期望的操作,因为它将在执行
local myFunc
时使用myFunc的任何可用定义(可能指向myFunc的upvalue或全局变量)。4将起作用,但这只是因为它将(再次)将新创建的函数分配给upvalue或全局变量(并在函数体中引用相同的值)。谢谢!因此,当我在代码1中使用局部函数myFunc()
时,它们都变得相同了?@HKTonyLee:事实上,没有。我完全误读了你的项目#2。看看我的新版本。