2017-02-01 6 views
1

問題テーブルの新しい値が共有されていますか?

私は偶然見つけたluaを学ぼうとしながら、これよりも

a = {"a"} 
b = a 

は(驚き)を生成しない場合に:

a 
{"a"} --[[table: 0x046bde18]] 
b 
{"a"} --[[table: 0x046bde18]] 

が、その後の場合は:

a[2] = "b" 

a == bはまだtrueですか?

a 
{"a", "b"} --[[table: 0x046bde18]] 
b -- this is a surprise 
{"a", "b"} --[[table: 0x046bde18]] 

この両方の方法を動作するようです:新しい値はbに割り当てられている場合、それはまたaに割り当てられます。 a値が変更された場合(a = 2)、その後b = a次いでbは、元の値(静止b = 1)を保持する:私はa値(a = 1例)を割り当てる一方

質問

  1. なぜこの現象がaはアレイ/テーブルまたは値であるwheatherによって異なりますか?組み込みのメタテーブル(__newindex)が原因ですか?
  2. このようなアレイ/テーブルの動作の目的は何ですか?
  3. abを何らかの形で区別したい場合(またはbを変更する前にaの値を保存する場合はどうすればよいですか)

(私はマニュアルLuaのリファレンスのLuaのAssignmentMetatables and Metamethods章を読みますが、そのような行動はoccuresなぜまだ見当もつかない。)

+0

なぜこのような一般的な問題がありますか?あなたがしているのは、変数aに代入された値に変数bを代入することだけです。 – warspyking

+0

初心者のプログラマーとしての@warspyking私はそれが直感的ではないことを発見しました(しかし、解答で説明されているように正当なものです) – Siemkowski

答えて

2

あなたの例では、abは同じテーブルにだけ言及しています。 Luaでは、テーブルはオブジェクトで、テーブルを作成して最初のステートメントでaに割り当てた後、2番目の割り当てで同じテーブルへの2番目の参照を作成しました。したがって、a[2] = "b"b[2] = "b"は同じ基本テーブル(テーブル:0x046bde18)で動作しています。

テーブルは値ではなく、オブジェクトです。 a = {"a"}はテーブルを作成し、テーブルへの参照をaに割り当てます。 b = abに同じ参照を割り当てます。ただし、x = 1010xに割り当てます。 y = 10で、基礎値が10の場合は、この変更がxyに反映されると思いますが、これを行う方法はわかりません。このコードで:

x = 10 
y = 10 
y = y + 1 

得られた値はx = 10、及びy = 11であろう。基礎となる値10は変更されていませんが、yは値11に再割り当てされました。

独立して変更できるテーブルのコピーを2つ使用する場合は、aのメンバーをb = {}にコピーする関数を記述する必要があります。 Here is a question that discusses making copies of tables

関連する問題