Я использовал arg в качестве имени аргумента функции:
function foo(cmd, arg)
-- etc.
end
Я только что узнал, что arg - это специальная скрытая переменная, которая представляет таблицу аргументов при использовании переменные аргументы:
function foo(bar, baz, ...)
-- `arg` now holds arguments 3 and up
end
Стоит ли ожидать каких-либо проблем с использованием arg в качестве имени аргумента в моем коде?
Это довольно солидный и неочевидный ответ ... не могли бы вы добавить его в качестве ответа?
Я действительно не уверен, что это ошибка или особенность. LuaJIT, насколько я знаю, такого эффекта не имеет. Но поскольку Lua 5.1 больше не поддерживает, теперь это особенность :)
@moteus - Спасибо, что поделились этой функцией Lua. LUA_COMPAT_VARARG (включен по умолчанию) очень опасен.





Я знал, что это вызовет проблемы, но не знал, в чем конкретно. Поэтому я решил попробовать сам.
Я попробовал функцию, показанную в вашем примере, и получил ошибку переполнения стека.
И согласно официальному сайту lua,
When this function is called, all its arguments are collected in a single table, which the function accesses as a hidden parameter named arg.
Поэтому я считаю, что лучше не называть параметры "arg".
Во-первых, обратите внимание, что я использую Lua 5.3, и это моя версия. (Хотя, думаю, я предпочитаю его просто потому, что это тот, который я начал и с которым я больше всего знаком.)
Во-вторых, какую версию Lua вы используете? В Lua 5.3 arg относится к таблице, содержащей все аргументы командной строки, переданные сценарию. Например, скажем, у меня есть сценарий под названием 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.