Почему таблица arg Луи не индексируется? - PullRequest
0 голосов
/ 15 декабря 2018

В командной строке 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 голосов
/ 15 декабря 2018

arg в Lua mimics argv в C: arg[0] содержит имя скрипта, так же как argv[0] содержит имя программы.

Это не противоречит массивам на основе 1в Lua, поскольку аргументы сценария являются более важными данными.Название сценария используется редко.

0 голосов
/ 15 декабря 2018

Спрашивать , почему были приняты определенные дизайнерские решения, всегда сложно, потому что только создатель языка действительно может ответить.Я думаю, он был выбран таким образом, что вы можете перебирать аргументы, используя ipairs, и вам не нужно обрабатывать первый специальный аргумент, потому что это имя скрипта, а не аргумент.

#arg в любом случае не имеет смыслапотому что он подсчитывает только количество элементов в последовательном разделе массива, но нулевой и отрицательный индексы хранятся в разделе hashmap.Чтобы получить фактическое количество элементов, используйте

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

По крайней мере, это задокументировано в Программирование на Lua :

Главный скрипт может получить свои аргументы вглобальная переменная arg.При вызове, подобном

prompt> lua script a b c

, lua создает аргумент таблицы со всеми аргументами командной строки перед запуском сценария.Имя скрипта входит в индекс 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], в примере).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...