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

alo*_*ras 2 lua luajit openresty

我的理解是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()
Run Code Online (Sandbox Code Playgroud)

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

运行resty test.lua hello world结果为:

0 test.lua
1 hello
2 world
-1 /usr/local/bin/resty
Run Code Online (Sandbox Code Playgroud)

为什么这有效?Openresty 和 LuaJIT 可以使用的 5.1 语法是否有例外?

Vla*_*lad 5

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

您在这里看到的表arg不是“已弃用的 Lua 功能”。它是提供给 Lua 解释器的参数表,arg由解释器显式推送到全局变量,并且在最新的 Lua 和 LuaJIT 版本中仍然存在。

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