为什么 Lua 的 arg 表不是从一开始索引的?

在 Lua 命令行中,当我像这样向脚本传递参数时:

lua myscript.lua a b c d

我可以从全局的 arg 表中读取我的脚本名和参数。arg[0] 包含脚本名称,arg[1] - arg[#arg] 包含其余参数。这个表的奇怪之处在于它在索引 0 处有一个值,而其他 Lua 数组始于索引 1。这意味着在像这样迭代它时:

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

输出仅考虑索引 1-4,并且不打印脚本名称。并且 #arg 的值为 4,而不是 5。

这个决定是否有任何好的理由?它最初让我不知所措,我不得不验证手册是否错误。

点赞
用户1944004
用户1944004

提问_为什么_做出了某些设计决策总是很棘手的,因为只有语言的创建者才能真正回答这个问题。我猜它被选择是这样的,你可以使用ipairs遍历参数,不必处理第一个,因为它是脚本名称而不是参数。

#arg无论如何都是无意义的,因为它仅计算连续数组部分的元素数量,但零号和负索引存储在哈希映射部分。要获取实际元素数量,请使用

local n = 0
for _ in pairs(arg) do
    n = n + 1
end

至少它在《Lua编程》 中有记录:

主脚本可以在全局变量'arg'中检索其参数。在如下调用中:

prompt> lua script a b c

在运行脚本之前,lua将在table'arg'中创建所有命令行参数。脚本名称进入索引0;其第一个参数(例如示例中的a)进入索引1,依此类推。最终选项位于脚本之前的负索引中。例如,在以下调用中

prompt> lua -e "sin=math.sin" script a b

lua按以下方式收集参数:

arg[-3] = "lua"
arg[-2] = "-e"
arg[-1] = "sin=math.sin"
arg[0] = "script"
arg[1] = "a"
arg[2] = "b"

往往,脚本仅使用正索引(例如示例中的 arg[1]arg[2])。

2018-12-15 07:22:21
用户107090
用户107090

在 Lua 中,arg 类似于 C 语言中的 argvarg[0] 包含了脚本的名称,就像 argv[0] 包含了程序的名称。这不违背 Lua 中基于 1 的数组,因为对脚本的参数更为重要。脚本的名称很少被使用。

2018-12-15 11:57:17