使用`arg`作为 Lua 中的参数名称是否有副作用?

我正在为函数使用arg作为参数名称:

function foo(cmd, arg)
    -- 等等 
end

我刚刚了解到,当使用 变量参数 时,arg是一个特殊的隐藏变量,代表参数表:

function foo(bar, baz, ...)
    -- `arg` 现在持有第 3 个及以上的参数
end

我在代码中使用arg作为参数名称会有任何问题吗?

点赞
用户12726311
用户12726311

我知道这会引起问题,但我不确定具体是什么问题。所以我决定自己尝试一下。

我尝试了你的示例中显示的函数,结果得到了堆栈溢出错误。

根据官方 Lua 网站上的描述:

当调用这个函数时,所有的参数都被收集到一个单独的表格中,函数通过一个名为 arg 的隐藏参数来访问这个表格。

因此,我认为最好避免将参数命名为 "arg"。

2020-01-16 17:46:44
用户9922866
用户9922866

首先,请注意我正在使用 Lua 5.3,这是我喜欢的版本。(尽管我想我之所以喜欢它是因为它是我开始学习的版本,并且我最熟悉它。)

其次,你使用的是 Lua 的哪个版本?在 Lua 5.3 中,arg指的是包含传递给脚本的所有命令行参数的表。例如,假设我有一个名为 test.lua 的脚本,它看起来像这样:

for i, v in ipairs(arg)  do
    print(i, v)
end

如果我像这样执行脚本 lua test.lua hello there, friend,它将生成以下输出:

hello
there,
friend

请注意,在 Lua 5.3 中,arg是全局环境表 _ENV 的成员;因此,arg等价于_ENV.arg_ENV["arg"]

在 Lua 5.3 中,似乎已经弃用了将arg作为函数的可变参数标记的用法。然而,一个简单的基于表的解决办法如下面的例子所示:

function foo(...)
    -- 在表中收集可变参数。
    local args = {...}
    for i, v in ipairs(args) do print(i, v) end
    return
end

关于local args = {...}这一行的行为与旧版本 Lua 中函数中的变量arg相同。

2020-01-17 04:36:59