В Lua, я могу легко выбрать N-й результат без пользовательских функций? - PullRequest
5 голосов
/ 24 апреля 2010

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

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 функций?

Ответы [ 3 ]

11 голосов
/ 24 апреля 2010

Вы можете заключить выражение в скобки:

table.insert(tbl, (string.gsub(input, "a", "b")))

Это выберет только первый результат.

Чтобы получить n-й результат, вы можете использовать select и заключить его в скобки:

func1( (select(n, func2())) )
5 голосов
/ 15 сентября 2013

В одной строке: ({ funct(args) })[n] вернет n-й результат без объявления именованных переменных.

5 голосов
/ 24 апреля 2010

Помещение выражения в скобки, например:

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)
...