为什么 LuaJIT/Openresty 可以使用已弃用的 'arg' 语言功能?

Why can LuaJIT/Openresty use deprecated 'arg' language feature?

我的理解是 LuaJIT 使用 Lua 5.1 语法。在 Lua 5.1 中,'arg' 功能已从语言中删除。

但是,以下代码有效。

// test.lua
local function foo()
  for k,v in pairs(arg) do
    print(k .. " " .. v)
  end
end

foo()

我希望 arg 为零,但它存在并且正在执行 Lua 5.0 功能。

运行 resty test.lua hello world 结果:

0 test.lua
1 hello
2 world
-1 /usr/local/bin/resty

为什么这行得通? Openresty 和 LuaJIT 可以使用的 5.1 语法有例外吗?

你在混合两种不同的东西。

您在这里看到的 arg table 不是 "deprecated Lua feature"。它是给 Lua 解释器的 table 个参数,由解释器显式推送到全局 arg 变量,它仍然存在于最新的 Lua 和 LuaJIT 版本。

您听说过的功能已删除 - 即在可变参数函数中用可变参数表达式替换隐式 arg 参数。 IE。函数的额外参数现在可通过 ... 语法使用,而不是作为通过隐式 arg 参数收集的值的 table。