Есть ли побочные эффекты при использовании `arg` в качестве имени аргумента в Lua?

Я использовал arg в качестве имени аргумента функции:

function foo(cmd, arg)
    -- etc.
end

Я только что узнал, что arg - это специальная скрытая переменная, которая представляет таблицу аргументов при использовании переменные аргументы:

function foo(bar, baz, ...)
    -- `arg` now holds arguments 3 and up
end

Стоит ли ожидать каких-либо проблем с использованием arg в качестве имени аргумента в моем коде?

github.com/luarocks/luarocks/issues/931
moteus 14.10.2018 14:52

Это довольно солидный и неочевидный ответ ... не могли бы вы добавить его в качестве ответа?

slackwing 14.10.2018 14:52

Я действительно не уверен, что это ошибка или особенность. LuaJIT, насколько я знаю, такого эффекта не имеет. Но поскольку Lua 5.1 больше не поддерживает, теперь это особенность :)

moteus 14.10.2018 17:39

@moteus - Спасибо, что поделились этой функцией Lua. LUA_COMPAT_VARARG (включен по умолчанию) очень опасен.

Egor Skriptunoff 14.10.2018 18:49
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
4
184
2

Ответы 2

Я знал, что это вызовет проблемы, но не знал, в чем конкретно. Поэтому я решил попробовать сам.

Я попробовал функцию, показанную в вашем примере, и получил ошибку переполнения стека.

И согласно официальному сайту 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.

Другие вопросы по теме