为什么Lua的arg表不被单索引?

时间:2018-12-15 07:14:21

标签: lua

在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。

这个决定是否有充分的理由?最初让我大吃一惊,我不得不确认手册没有弄错。

2 个答案:

答案 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语言中的argvarg[0]包含脚本的名称,就像argv[0]包含程序的名称。

这与Lua中基于1的数组并不矛盾,因为脚本的参数是更重要的数据。脚本的名称很少使用。