1

すべてのrubyオブジェクトに存在する固有のメソッドの1つ、つまりobject_idメソッドの動作について混乱しています。Fixnumオブジェクトに対してobject_idメソッドを何度も実行すると、たとえばirbでこれを実行すると、

>> 100.object_id
=> 201

そしてこれをもう一度やりなさい、

>> 100.object_id
=> 201

しかし、たとえばStringオブジェクトを操作する場合

>> "Hello" .object_id
=> 162333336

そしてこれをもう一度やりなさい、

>> "Hello" .object_id
=> 15502236

なぜそうなのか?ルビーでは、すべてがオブジェクトであり、すべてのオブジェクトには、オブジェクトを一意に識別するobject_idという名前の固有のメソッドがあります。しかし、ここでは、rubyは、同じテキスト(つまり、「Hello」)を持つ2つの文字列を異なるものとして扱いますが、同じ値(つまり、100)を持つ2つのFixnumオブジェクトを同じものとして扱い、同じオブジェクトIDを与えるために混乱します。なぜそうなのか?誰か助けてくれませんか?

4

3 に答える 3

5

Fixnumは、Rubyでは不変のオブジェクトです。作成されたインスタンスは1つだけで、そのオブジェクトを「直接」操作します。つまり、他の通常のオブジェクトとは異なり、参照は使用されません。したがって、object_idは固定されています。オブジェクトのインスタンスが1つしかないため、これは問題ありません。

ただし、「hello」と書くと、新しい文字列オブジェクトが作成されます。また、同じスクリプトで、同じコンテンツであっても、別の「hello」を指定すると、新しいオブジェクトが作成されます。したがって、異なるobject_ids。

于 2012-11-08T07:22:55.930 に答える
1

このような動作は、仕様ではなく、Rubyの実装の問題です。ほとんどの場合、MRI(Cソースからコンパイル)を使用していますが、JRubyではさまざまな結果を得ることができます。

パフォーマンスの目的で、MRIは、、、およびtrueを特別に処理します。あなたがそれについてのより多くの情報を見つけることができるいくつかのリンク:http //www.oreillynet.com/ruby/blog/2006/02/ruby_values_and_object_ids.html、http://rhg.rubyforge.org/chapter02.htmlfalsenilFixnumsymbol

于 2012-11-08T07:30:32.250 に答える
0

文字列と同じオブジェクトIDを取得する場合は、最初にそれをシンボルに変換する必要があります。その後、object_idは一定のままです。

'Hello'.to_sym.object_id
于 2013-01-09T19:28:49.627 に答える