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
时。他们的行为不一样。(例如,upvalue
someVariable
…有问题的:-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。看看我的新版本。