3

これは私が試したものです:

a = "Hello world"
a.object_id    # => -633222538
b = a
b.object_id    # => -633222538
b << " i say"  # => "Hello world i say"
a              # => "Hello world i say"

b変数と変数の両方がa同じオブジェクト ID を持つのはなぜですか? また、私が変更するbと、どのようにa変更されましたか?

更新: 変数が引数としてメソッドに渡される場合はどうですか? 受信変数が同じ参照を持っているのはなぜですか?

4

4 に答える 4

5

それらは同じオブジェクトを参照しています:

a = "Hello world"     # a now references #-633222538
b = a                 # b now references #-633222538, too
b << " i say"         # this appends " i say" to #-633222538
a                     # a still references #-633222538

String#<<新しいオブジェクトを割り当てるのではなく、指定された文字列に追加するため、レシーバーが変更されます。

コピーが必要な場合は、cloneまたはを使用できますdup

b = a.clone
a == b      #=> true (same string values)
a.equal? b  #=> false (different objects)

整数について

参照に違いはありません:

a = 100
a.object_id  #=> 201
b = a
b.object_id  #=> 201

両方とも、同じオブジェクトaを参照します。b唯一の違いは、Ruby では整数を変更できず、固定されていることです。

変数を引数として渡す

再び、参照が渡されます。

a = "foo"
p = proc { |x| x << "bar" }
p.call(a)
a
#=> "foobar"
于 2013-06-14T13:35:49.197 に答える
2

参考文献を入力

その答えは、Ruby の変数 (いくつかの例外を除いて、特に整数にバインドされた変数) はオブジェクト値を保持しないということです。a「Hello world」は含まれません。むしろ、a文字列オブジェクトへの参照が含まれています。「Hello World」を構成する文字を含むという特徴を持つ文字列オブジェクトです。

左側に変数名、右側にオブジェクトを持つ割り当てでは、変数はオブジェクトへの参照を受け取ります。ある変数から別の変数への代入 ( a = b) では、左側の変数は右側の変数に格納されている参照のコピーを受け取り、その結果、両方の変数に同じオブジェクトへの参照が含まれるようになります。

変数がオブジェクトへの参照を保持しているという事実は、オブジェクトを変更する操作に影響を与えます。文字列連結操作

b << " i say"

参照先の文字列の文字をbテキスト " i say" と連結します。変数aには、同じ文字列オブジェクトへの別の参照が含まれています。置換メッセージは に送信されますがb、 の参照が参照するオブジェクトが変更されbます。を印刷するaと、結果が表示されます。文字列の内容が変更されています。

Ruby の一部のオブジェクトは、即値として変数に格納されます。これらには、整数、記号 ( のように見える:this)、および特別なオブジェクトtruefalse、およびが含まれnilます。これらの値のいずれかを変数 ( x = 1) に代入すると、変数は値への参照ではなく、値自体を保持します。

Manning The Well Grounded Rubyistからコピーおよび変更。

于 2013-06-14T13:49:14.927 に答える
1

同じオブジェクトを別の変数と共有する変数に対して可変関数を呼び出したようです。代わりに b = b + 'i say' を実行すると、a は変更されません。

于 2013-06-14T13:33:20.937 に答える
0

変数abは String オブジェクトへの参照です。割り当てを行ったときb = a、参照をコピーしました。オブジェクトの新しいコピーは作成されません。文字列オブジェクトを新しいオブジェクトにコピーする場合は、次のようにします。

a = "abc"
b = ""  [or, b = String.new]
b << a

これで、値が「abc」の独立した文字列オブジェクトになりaます。b

于 2013-06-14T13:35:09.483 に答える