为什么 lua 不允许本地 lambda 函数递归调用自己?

Kwo*_*unn 2 recursion lua functional-programming

我正在尝试在 Lua 中实现一种装饰器模式,在此过程中我遇到了有关 lambda 函数调用自身的问题。

下面的代码运行良好:

local function foo()
    print("bar")
    foo()
end

foo()
Run Code Online (Sandbox Code Playgroud)

但以下行为是不允许的:

local foo = function ()
    print("bar")
    foo()
end

foo()
Run Code Online (Sandbox Code Playgroud)

解释器抛出以下错误:

Exception has occurred: main.lua:27: attempt to call a nil value (global 'foo')
stack traceback:
    main.lua:27: in local 'foo'
    main.lua:30: in main chunk
    [C]: in ?
Run Code Online (Sandbox Code Playgroud)

lua 文档指出“在 Lua 中编写函数的常用方法,就像function foo (x) return 2*x end我们所说的语法糖的一个实例;换句话说,这只是一种漂亮的编写方式foo = function (x) return 2*x end”,所以在我看来这些应该是相等的。

我缺少什么?

Nic*_*las 5

换句话说,这只是一种漂亮的写作方式foo = function (x) return 2*x end

是的,就是这样functionlocal function工作原理略有不同。

问题是编译器不知道foo函数中的named是局部变量,因为局部变量的完整声明foo还没有完成。而且这只发生在整个语句的末尾local function;在此之前,foo将引用全局变量。

为了防止这种情况,local function X <stuff>有两个语句的语法糖:local X; X = function <stuff>。如果您愿意,您可以执行相同的操作,但局部变量的声明必须是与函数表达式本身分开的语句。