2

このようにテーブルをクリアすると、予期される動作が発生します。

table1 = { "a" }
table1 = {}
print(unpack(table1))        -- results in printing a blank line

しかし、関数内で同じことを行う場合、次のことは必要ありません。

table1 = { "a" }

function cleartest (x)
    x = {}
    print(unpack(x))
end

cleartest(table1)            -- results in printing a blank line
print(unpack(table1))        -- results in "a"

この動作の原因は何ですか?

編集:Luaでテーブルを渡す方法を明確にするため。x は table1 のローカル「コピー」ではありません。「値は参照」タイプであるため、実際には実際のテーブルへの参照です。例えば:

table1 = { "a" }

function xisref (x)
    x[2] = "b"
end

xisref(table1)
print(unpack(table1))         -- results in printing "a    b" thus x is a reference to the actual table
4

2 に答える 2

3

テーブルの値を実際にクリアすることはできないため、名前だけです。

もしあなたがそうするなら

table1 = { "a" }
table1 = {}

{ "a" }に設定していませんが、以前の値を置き換える{}ように設定しています。その値は現在アクセスできず、最終的にはガベージ コレクターによってクリアされます。table1{}

を呼び出すとcleartest、 thenxもと同じ値を指します、別の (ローカル) 名前です。そうすることで、単に新しい空のテーブルを指すようになりますが、それはまだ を指しているものについては何も変わりません。{ "a" }table1xx = {}xtable1{ "a" }

あなたの編集への対応:

Yesxは と同じ値への参照table1です。しかし x、たまたまその値を指すローカル名にすぎません。に何かを割り当てた瞬間x、ローカル変数は、x以前に指していた値に影響を与えることなく、何か新しいものを指します。

これを試してください(どこでも、グローバル、ローカルは関係ありません):

test1 = { "a" }
test2 = test1
-- printing them now gives the same table
test1 = 5
-- printing test1 gives 5; printing test2 still gives the table

に何か新しいものを割り当ててtest2印刷test1しても、同じ結果が得られます。

于 2013-03-22T22:26:24.400 に答える
1

あなたはテーブルを片付けていません。新しいテーブルを作成し、それを変数に割り当てています。

最初のケースでは、変数を上書きしているtable1ため、後の参照で新しい空のテーブルが取得されます。

x2 番目のケースでは、関数に対してローカルな変数を上書きしているため、後の参照table1は影響を受けません。関数で言った場合、最初のケースのように動作することに注意してtable1 = {}ください。cleartest()

同じテーブルへの他の参照がクリアされた状態を見るように、既存のテーブルを本当にクリアしたい場合は、次のように書く必要があります

for k in pairs(x) do
    rawset(x, k, nil)
end
于 2013-03-22T22:24:58.673 に答える