命名函数和匿名函数(Lua)之间的差异

HKT*_*Lee 4 lua functional-programming

这些myFuncs 之间有什么区别?

代码1

function wrapper()
    local someVariable = 0;
    function myFunc(n)
        if n > 0 then return myFunc(n-1) end
    end
    return myFunc;
end
Run Code Online (Sandbox Code Playgroud)

代码2

function wrapper()
    local someVariable = 0;
    local myFunc = function(n)
        if n > 0 then return myFunc(n-1) end
    end
    return myFunc;
end
Run Code Online (Sandbox Code Playgroud)

代码3

function wrapper()
    local someVariable = 0;
    local myFunc;
    myFunc = function(n)
        if n > 0 then return myFunc(n-1) end
    end;
    return myFunc;
end
Run Code Online (Sandbox Code Playgroud)

因为当我myFuncmyFunc自己内部引用函数名称时.他们的行为不一样.(例如,upvalue someVariable......有问题:-S)

Nic*_*las 5

[编辑:我误读了你的代码#2.]

代码#1设置myFunc函数的全局值.因此,每次打电话wrapper,您都会将此全局设置为新值.此外,对您的myFunc调用的任何引用都将是对此全局(可修改),而不是对本地(这将是关闭的高价值).

代码#2设置局部变量myFunc.但是,由于Lua的规则,该局部变量仅定义它的语句完成后才进入范围.这允许你做这样的事情:

local x = x or 5
Run Code Online (Sandbox Code Playgroud)

x表达式是先前声明的局部或全局.xx or 5表达式被评估之后,新的才进入范围.

您的功能定义也是如此.因此,任何引用都myFunc将是全局变量,而不是本地变量.

代码#3创建一个局部变量myFunc.然后它将该变量设置为一个函数.因为函数是在局部变量进入范围之后创建的myFunc,所以函数中的引用将引用局部变量,而不是全局变量.

注意local function X相当于local X; X = function....local X = function....