【问题标题】:Difference(s) between named function & anonymous function (Lua)命名函数和匿名函数 (Lua) 之间的区别
【发布时间】:2013-03-29 13:58:09
【问题描述】:

这些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(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)

【问题讨论】:

    标签: functional-programming lua


    【解决方案1】:

    [编辑:我误读了您的代码 #2。]

    代码#1 将myFunc 的全局值设置为函数。所以每次你打电话给wrapper,你都会将这个全局设置为一个新值。此外,对您的 myFunc 调用的任何引用都将指向此全局(可修改),而不是本地(这将是闭包的上值)。

    代码#2 设置一个局部变量myFunc然而,由于 Lua 的规则,该局部变量只有在定义它的语句完成之后进入范围。这允许您执行以下操作:

    local x = x or 5
    

    表达式中的x 是先前声明的局部或全局。新的 x 直到 x or 5 表达式被计算后才会进入范围。

    函数定义也是如此。因此,任何对myFunc 的引用都将是一个全局变量,而不是一个局部变量。

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

    注意local function X 等同于local X; X = function...不是local X = function...

    【讨论】:

    • 谢谢!那么当我在代码 1 中使用local function myFunc() 时,它们都变得相同了吗?
    • @HKTonyLee:实际上,没有。我完全误读了您的第 2 项。查看我的新版本。
    【解决方案2】:

    Nicol 的回答基本正确,但有一点值得指出:

    在代码 2 中 MyFunc 不需要是全局变量,它可以是某个外部范围内的局部变量,这将成为您正在创建的此函数的上值(相同的注释也适用于代码 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:

    1. local myFunc; myFunc = function(n) ... return myFunc(n-1) end
    2. local function myFunc(n) ... return myFunc(n-1) end
    3. local myFunc = function(n) ... return myFunc(n-1) end
    4. myFunc = function(n) ... return myFunc(n-1) end

    1 和 2 是完全等价的。 3 不会做你所期望的,因为它将使用 myFunc 的任何定义,当 local myFunc 被执行时(它可能指向 MyFunc 的上值或全局变量)。 4 会起作用,但这只是因为它将新创建的函数分配给(再次)一个上值或一个全局变量(并在函数体中引用相同的值)。

    【讨论】:

      猜你喜欢
      • 2019-09-03
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 2017-04-04
      • 1970-01-01
      • 1970-01-01
      • 2011-12-29
      • 2011-01-09
      相关资源
      最近更新 更多