3

右側の欠損値が nil と見なされないように、lua に複数の代入を行う方法はありますか?

に似ている

     a,b,c = 1

しかし、取得

     a = 1, b = 1, c = 1

結果として。

不運にも、

    a = b = c = 1

動作しません。

右側に複雑なテーブルがある可能性があり、それを短くシンプルに保ちたい (追加の変数なし) ため、これが必要です。

4

4 に答える 4

4

いいえ。

最初の例(複数の代入)にはすでに明確に定義されたセマンティクスがあるため、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)

しかし、それはかなり厄介です。


好奇心から、同じスコープ内の同じテーブルへのさまざまな参照が必要なのはなぜですか?

于 2012-06-01T21:52:40.937 に答える
3

次の関数を使用できます。

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;
于 2012-06-01T14:42:45.393 に答える
3

いいえ、この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

予想通り。

于 2012-06-01T00:03:47.610 に答える