嵌套的Lua函数中如何计算Upvalue?

使用如下 lua 代码段:

local a, b
function fA ()
    print(a)
    function fB ()
        print(b)
    end
end

fA 到底有多少个 upvalue,是 1 还是 2?

点赞
用户734069
用户734069

这是具体实现相关的;它可能是一个或两个。或者三个(其中一个为环境的上值)。你不知道,你也永远不应该关心。

2013-08-23 06:08:07
用户107090
用户107090

根据定义,函数中使用的所有外部局部变量都会被视为上值。如前所述,在Lua 5.2中,如果函数使用全局变量,则还存在一个隐藏的环境上值。

你可以使用 luac -l -l 查看代码生成的字节码。

可能会让你感到困惑的是在 fA 主体中定义的 fB。请记住,function fB () print(b) end 只是 fB = function () print(b) end 的简写形式。当你这样做时,显然在 fA 中使用了 b,同时你也将其赋值给了全局变量 fB。因此,在Lua 5.2中,fA 的上值为3。(使用 print 也意味着 fA 使用了全局变量。)如果你使用 local function fB ... 并删除 print,则会发现 fA 在5.1和5.2中都使用了2个上值。

2013-08-23 10:26:38