右側の欠損値が nil と見なされないように、lua に複数の代入を行う方法はありますか?
に似ている
a,b,c = 1
しかし、取得
a = 1, b = 1, c = 1
結果として。
不運にも、
a = b = c = 1
動作しません。
右側に複雑なテーブルがある可能性があり、それを短くシンプルに保ちたい (追加の変数なし) ため、これが必要です。
右側の欠損値が nil と見なされないように、lua に複数の代入を行う方法はありますか?
に似ている
a,b,c = 1
しかし、取得
a = 1, b = 1, c = 1
結果として。
不運にも、
a = b = c = 1
動作しません。
右側に複雑なテーブルがある可能性があり、それを短くシンプルに保ちたい (追加の変数なし) ため、これが必要です。
いいえ。
最初の例(複数の代入)にはすでに明確に定義されたセマンティクスがあるため、Luaには、さまざまなセマンティクス(最後のr値を繰り返す)が必要であることを示すために、演算子/キーワード/何かを追加する必要があります。そうではありません。
2番目の例(割り当てを連鎖させる、ala C)では、割り当てを式にする必要がありますが、Luaではステートメントです。
最も近いのは、スタックに値を何度もプッシュする関数を定義することです。
function push(x)
return x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
end
次に、あなたは言うことができます:
a,b,c,d,e,f,g = push(t)
しかし、それはかなり厄介です。
好奇心から、同じスコープ内の同じテーブルへのさまざまな参照が必要なのはなぜですか?
次の関数を使用できます。
local a,b,c = (function(t) return t,t,t; end)({1,2,3});
それでも、私は明白な解決策を好みます:2行を使用するだけです
local a = {1,2,3};
local b,c = a,a;
いいえ、このAFAIKの近道はありません。
また、これはおそらくテーブルの値に対して望むようには機能しないでしょう。
local some_tbl = {a = 1, b = 2, c = 3}
-- you just assigned the same table to both variables
local a,b = some_tbl, some_tbl
a.a = 5
print(a.a, b.a)
上記のコードは次を出力します。
>lua -e "io.stdout:setvbuf 'no'" "junk.lua"
5 5
両方の変数のテーブルの値を変更しただけです (これはおそらくあなたが望んでいたものではありません。おそらく、各変数に同じテーブル定義を割り当てたかったのですが、各テーブルには異なるデータが保持されていました)。
同じテーブル構造の個別のコピーを操作するコードがある場合、同じ定義の新しいコピーを返すゲッター関数を記述します。上記のコードで使用すると、次のようになります。
function get_TableLayout1()
-- return separate copies of the same table layout
return {a = 1, b = 2, c = 3}
end
local a,b = get_TableLayout1(), get_TableLayout1()
a.a = 5
print(a.a, b.a)
これは出力します:
>lua -e "io.stdout:setvbuf 'no'" "junk.lua"
5 1
予想通り。