В Луа я могу легко выбрать N-й результат без пользовательских функций?
-
01-10-2019 - |
Вопрос
Предположим, я вставляю строку в таблицу следующим образом:
table.insert(tbl, mystring)
и что mystring
генерируется заменой всех вхождений «A» с «B» в input
:
mystring = string.gsub(input, "a", "b")
Очевидный способ объединить два в одном утверждении не работает, потому что gsub
Возвращает две результаты:
table.insert(tbl, string.gsub(input, "a", "b")) -- error!
-- (second result of gsub is passed into table.insert)
Что, я полагаю, это цена, уплаченная за поддержку нескольких возвратных значений. Вопрос в том, есть ли стандарт, встроенный, чтобы выбрать только первое возвращаемое значение? Когда я нашел select
Я думал, что это именно то, что это сделал, но увы, это на самом деле выбирает все Результаты от n напротив, и поэтому не помогает в этом сценарии.
Теперь я знаю, что могу определить свой собственный select
следующим образом:
function select1(n, ...)
return arg[n]
end
table.insert(tbl, select1(1, string.gsub(input, "a", "b")))
Но это не выглядит правильно, так как я ожидал, что встроенный способ сделать это.
Итак, я пропускаю встроенный постройку? Если нет, разработчики Lua имеют тенденцию использовать отдельную переменную для извлечения правильного аргумента или написать свои собственные select1
Функции?
Решение
Вы можете окружить выражение скольжениями:
table.insert(tbl, (string.gsub(input, "a", "b")))
Это выберет только первый результат.
Чтобы получить N-й результат, вы можете использовать select
И окружите его скобками:
func1( (select(n, func2())) )
Другие советы
Положить выражение в скобки, как это:
table.insert(tbl, (string.gsub(input, "a", "b")))
будет заставить одно возвращаемое значение. Или вы могли бы поймать их как так:
str,cnt = string.gsub(input, "a", "b")
table.insert(tbl, str)
Или еще лучше, манекен уловит его, чтобы сохранить переменную:
str,_ = string.gsub(input, "a", "b")
table.insert(tbl, str)
В одной строке: ({ funct(args) })[n]
вернет результат n'th без объявления каких-либо именованных переменных.