在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。
这个决定是否有充分的理由?最初让我大吃一惊,我不得不确认手册没有弄错。
答案 0 :(得分:3)
问为什么做出某些设计决定总是很棘手,因为只有语言的创建者才能真正回答。我猜选择它的目的是使您可以使用ipairs
遍历参数,而不必处理第一个特殊参数,因为它是脚本名称而不是参数。
#arg
毫无意义,因为它仅计算连续数组部分中的元素数量,而第零个索引和负索引存储在哈希映射部分中。要获取元素的实际数量,请使用
local n = 0
for _ in pairs(arg) do
n = n + 1
end
至少在Programming in Lua中有记录:
主脚本可以在全局变量
这样的通话中arg
中检索其参数。在像prompt> lua script a b c
lua在运行脚本之前,使用所有命令行参数创建表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]
)。
答案 1 :(得分:2)
arg
在Lua中模仿了C语言中的argv
:arg[0]
包含脚本的名称,就像argv[0]
包含程序的名称。
这与Lua中基于1的数组并不矛盾,因为脚本的参数是更重要的数据。脚本的名称很少使用。