2016-06-16 5 views
1

Можно ли установить значения по умолчанию для нескольких переменных в Lua? Кажется, я с трудом справляюсь с этим.Lua - Установить значение по умолчанию для нескольких переменных

Моя логика: 1) Можно установить значения для нескольких переменных, как это:

> one, two = "uno", "dos" 
> print(one) 
uno 
> print(two) 
dos 

2) Можно установить значения по умолчанию для переменных, как это:

> foo = string.match("/dir/example.txt", "dir/(..)/.*") or "ab" 
> return print(foo) 
ab 

3) Когда я пытаюсь установить значения по умолчанию для нескольких переменных, у меня возникает проблема:

> foo, bar = string.match("/dir/xx/xx/example.txt", "/dir/(..)/(..)/.*") 
> print(foo) 
xx 
> print(bar) 
zz 

> foo, bar = string.match("/dir/xx/xx/example.txt", "/dir/(..)/(..)/.*") or "ab","cd" 
> print(foo) 
xx 
> print(bar) 
cd 

То, что я подозреваю, это то, что он обрабатывает все до последней запятой как значение «foo», и все после него как значение «bar».

Используя этот пример, можно ли указать, что они будут считаться значениями по умолчанию, если string.match не предоставляет значение?

+0

FWIW, я попробовал кучу разных способов инкапсулировать «ab» и «cd», чтобы они понимались как значения по умолчанию вместе, d размахивал форумами, но не мог найти аналогичный вопрос, не говоря уже о ответе, прежде чем я решил попробовать разместить здесь сообщение. :) – NNLocke

+0

'if not foo then foo, bar =" ab "," cd "end' –

ответ

3

Давайте объяснить, что происходит в случаях 1 и 2, перед тем решения проблемы вы столкнулись

  1. You устанавливают несколько значений для нескольких значений. Это синтаксический сахар, предоставленный Lua, каждая переменная разделяется запятой, также с каждым значением

  2. Вы устанавливаете значения по умолчанию. Вы действительно не предоставляете значение по умолчанию здесь, просто используя логическую операцию, которая выполняет задачу с идентичным выходом. Когда вы используете команду or, вы передаете 2 операнда, значение, которое вы хотите установить, и значение по умолчанию, если первое из них не существует. только причина, по которой это работает or возвращает второй аргумент, если первый равен нулю или false.

Теперь, когда у нас есть объяснения, давайте займемся самой проблемой.

a, b = str:match(pattern) or "y", "z" 

Lua не читает, что, как вы думаете. Луа видит эту запятую и, по существу, думает

a = str:match(pattern) or "y" 
b = "z" 

Потому что это то, что мы говорили. Мы разделили значения, как описано в # 1. Lua не распознает, что вы хотите назначить, какое совпадение возвращает ИЛИ те 2 значения.

Что касается фиксации ... Ну, у вас есть 2 варианта.Вы можете просто назначить его на регулярной основе:

a,b = str:match(pattern) 
if not (a and b) then 
    a,b = "y","z" 
end 

Или вы можете использовать таблицы

t = {str:match(pattern)} 
a,b = t[1] or "y", t[2] or "z" 

Это полностью зависит от вас

Мои извинения, если я неправильно понял ваш вопрос, пожалуйста, сообщите мне в комментариях если я это сделал

+0

Благодарим вас за красноречивое разъяснение и множество решений. :) – NNLocke

+0

Нет проблем, спасибо за ваш вклад в SO;) – warspyking

2

Лучше всего в таких случаях, как это просто сделать что-то вроде:

foo, bar = someoperation() 
foo = foo or defaultfoo 
bar = bar or defaultbar 
print(foo) 
print(bar) 
+0

Да, настройка значений по умолчанию по умолчанию индивидуально работает нормально, я просто удивлен, что вы не можете сделать это для нескольких переменных одновременно , – NNLocke