C ++に精通している場合は、Rubyのすべての変数、インスタンスなどを別のオブジェクトへの参照と見なすことができます。Rubyのすべてがオブジェクトでありnil
、NilClass型であっても、これはあらゆる状況で当てはまります。
参照しているオブジェクトを判別するには、object_id
メソッドを使用して区別することができます。&
これは、C++で使用するポインターへの変換に似ています。
このことを考慮:
a = "foo"
b = a
a.object_id == b.object_id
# => true
a
はその文字列への参照でb
あり、はのコピーであるためa
、実際には同じオブジェクトへの異なる参照です。
オブジェクトを変更する操作は、オブジェクトへのすべての参照に等しく影響するため、これは重要です。
a << "bar"
# => "foobar"
b
# => "foobar"
ただし、新しいオブジェクトを作成する操作では、すべてのコピーが変更されるわけではありません。
a += "baz"
# => "foobarbaz"
b
# => "foobar"
Rubyの多くのメソッドは!
、インプレースバージョンと新しいコピーバージョンを区別するためにによって識別されますが、常にそうであるとは限らないため、確実にするために各メソッドに精通している必要があります。
通常、割り当てによって古い参照が新しい参照に置き換えられるため、経験則として、=
古い参照が置き換えられます。+=
これは、、、などに-=
適用されます。||=
&&=
編集:ObjectSpace._id2ref(object_id)
オブジェクト識別子をオブジェクトに変換するための使用に関するPhrogzのコメントに基づいて更新されました。