gpt4 book ai didi

variables - lua中的全局和局部递归函数

转载 作者:行者123 更新时间:2023-12-02 23:21:38 24 4
gpt4 key购买 nike

我对 lua 非常陌生,我想了解以下行为。

当我尝试运行以下递归函数时:

local func = function ( n )
if n == 1 then return 1
else return n * func( n - 1 )
end
end

print( func( 5 ) )

程序将失败并出现错误:

lua: main.lua:16: attempt to call a nil value (global 'func')
stack traceback:
main.lua:16: in local 'func'
main.lua:38: in main chunk
[C]: in ?

这没关系,因为根据 explanationfunc 变量的本地版本尚不清楚,因此它尝试调用全局变量。但是当我删除 local 关键字时,以下代码可以正常工作吗?

func = function ( n )
if n == 1 then return 1
else return n * func( n - 1 )
end
end

print( func( 5 ) )

程序打印 120 作为结果,但全局 func 之前从未初始化或使用过。这怎么可能也不会引发错误?第二个示例不是像第一个示例一样引用全局 func 吗?

最佳答案

Isn't the second example referencing to global func as it does in the first one?

是:)

你看,当你编译新函数时,值是否存在并不重要。它不会检查 func 变量中存储的值,而是在每次调用时查找它。唯一重要的是变量的可见性。如果变量在局部范围内不可见,则它被视为全局变量,并将在全局环境表中查找。有关更多详细信息,请参阅 Lua 手册,章节 3.5 – Visibility Rules

第一个示例不起作用,因为在计算完整表达式之前,local func 变量不可见。这就是第一个示例失败的原因,尝试调用丢失的全局变量。

如果您希望该函数是本地函数,请声明该变量,然后然后对其进行赋值。喜欢:

local func
func = function ( n )
if n == 1 then return 1
else return n * func( n - 1 )
end
end

print( func( 5 ) )

对于这种情况,使用 Lua 的语法糖可能会更容易:

local function func( n )
if n == 1 then return 1
else return n * func( n - 1 )
end
end

print( func( 5 ) )

它将被完全翻译为声明变量的相同顺序,然后分配它。

这次 func 变量将对 new function(n) 可见,因此它将读取要从该特定 upvalue 调用的值。

请注意,稍后仍然可以通过向 func 变量分配不同的内容来“破坏”该函数。 Lua 中的函数(和任何其他值一样)没有名称,只有变量有名称。因此,对函数的调用不是硬编译的,要调用的函数值始终在每次调用之前从变量中获取。

关于variables - lua中的全局和局部递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48209461/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com