Перейти к содержимому
  • 0
artem211

Переменное число аргументов, arg ={...}

Вопрос

Граждане. 

Столкнулся в гугле с указанием параметров функций "...", указано, что при function a(...) bla bla end

в теле функции будет доступен тейбл arg, где полями будут как раз поданные в функцию аргументы. 

По всем примерам мною найденным так и должно быть. При попытке написать так - сталкиваемся с ошибкой что arg = nil всегда. Даже скопировал пример и попробовал запустить - результат тот же... Скажите что не так?

function sum(...)
r = 0
for i, v in ipairs(arg) do
  r = r + v
end
return r
end
print(sum(1,2,4,8,16,32))

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендуемые сообщения

arg ={...}, в этом проблема, нужно инициализировать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Напиши вместо ipairs(arg) просто ipairs({...}), или перед этим впиши arg = {...}

upd: Опоздал, блин.

Изменено пользователем unknown

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 01.07.2015 в 00:28, unknown сказал:

Напиши вместо ipairs(arg) просто ipairs({...}), или перед этим впиши arg = {...}

Пытаясь написать свою версию функции print(), я тоже интуитивно применил ipairs({...}). И т.к. функция предполагалась универсальной, я для теста подал в неё аргументы разных типов. В том числе и nil. На нём-то обработка и завершилась, хотя после nil были и другие аргументы.

 

Я подсмотрел код print из openOS, и там обработка аргументов выглядит примерно так:

function print(...)
  local args = table.pack(...)
  for i = 1, args.n do
    str = args[i]
  end
end

Решение показалось мне недостаточно красивым, и я попытался найти что-то более приятное глазу. Лучшего решения найти не удалось, но поиск привёл меня сюда. Полагаю, универсальное решение пригодится читателям этой темы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...