Есть ли побочные эффекты от использования `arg` в качестве имени аргумента в Lua?
Я использовал arg
в качестве имени аргумента для функции:
function foo(cmd, arg)
-- etc.
end
Я только что узнал arg
является специальной скрытой переменной, которая представляет таблицу аргументов при использовании переменных аргументов:
function foo(bar, baz, ...)
-- `arg` now holds arguments 3 and up
end
Стоит ли ожидать каких-либо проблем с использованием arg
как имя аргумента в моем коде?
0 ответов
Во-первых, обратите внимание, что я использую Lua 5.3, и это моя версия. (Хотя, думаю, я предпочитаю его просто потому, что это тот, который я начал и с которым я больше всего знаком.)
Во-вторых, какую версию Lua вы используете? В Lua 5.3arg
относится к таблице, содержащей все аргументы командной строки, переданные скрипту. Например, скажем, у меня есть сценарий под названием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(...)
-- Collect the variable arguments in a table.
local args = {...}
for i, v in ipairs(args) do print(i, v) end
return
end
Линия local args = {...}
имеет такое же поведение переменной arg
внутри функций в более старой версии Lua.
Я знал, что это вызовет проблемы, но не знал, в чем конкретно. Поэтому я решил попробовать сам.
Я попробовал функцию, показанную в вашем примере, и получил ошибку переполнения стека.
И согласно официальному сайту lua,
Когда эта функция вызывается, все ее аргументы собираются в одной таблице, к которой функция обращается как скрытый параметр с именем arg.
Поэтому я думаю, что лучше не называть параметры "arg"