2016-06-16 11 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をカプセル化して、それらを一緒にデフォルト値として理解させるようにしました。私はここで投稿しようとする前に、フォーラムを洗練しましたが、似たような質問は見つけられませんでした。 :) – NNLocke

+0

'foo、foo、bar =" ab "、" cd "end' –

答えて

3

は、あなたが、あなたは

  1. に直面している問題に取り組む前に、例1及び2で起きて何を説明しましょう複数の値を複数の値に設定しています。これはLuaによって提供される構文的砂糖であり、各変数はカンマで区切られ、各値とも同様に

  2. "デフォルト"の値を設定しています。同じ出力を持つタスクを実行する論理演算を使用するだけで、実際にはデフォルト値を提供しているわけではありません。 orコマンドを使用するときは、2つのオペランド、設定したい値、最初のオペランドが存在する場合はデフォルト値を渡します。 の理由は、orは、最初の引数がnilまたはfalseの場合は2番目の引数を返します。

ここで説明したとおり、問題自体を解説します。

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

ルアはあなたが思っているようにそれを読んでいません。ルアはコンマを見て本質的に考えると

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

問題ありません、あなたのご協力ありがとうございます;) – warspyking

2

このようなケースではあなたの最善の策はただのようなものを行うことです:

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

そうですね、変数のデフォルト値を個別に設定するとうまくいきます。 。 – NNLocke

関連する問題