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

我的理解是,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语法的例外情况?

点赞
用户5675002
用户5675002

你在混淆两个不同的事情。

你在这里看到的 arg 表并不是“已废弃的 Lua 特性”。它是一个由解释器显式推入全局 arg 变量的 Lua 解释器接收的参数表,而且在最新的 Lua 和 LuaJIT 版本中仍然存在。

你所听到的已被移除的功能是 - 用可变参数函数中的可变参数表达式代替隐式的 arg 参数。也就是说,现在可以通过 ... 语法获得函数的额外参数,而不是通过隐式的 arg 参数收集值的表格。

2018-09-30 20:53:03