В Луа я могу легко выбрать N-й результат без пользовательских функций?

StackOverflow https://stackoverflow.com/questions/2704771

Вопрос

Предположим, я вставляю строку в таблицу следующим образом:

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 без объявления каких-либо именованных переменных.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top