私はrubyのobject_id属性でオブジェクトを見つけることができますか?

私が新しい物体を作るとき、言いましょう

o = Object.new

このオブジェクトはIDを持ちますが、

o.object_id 
#=> ########

また、Objectクラスを使用していくつかのオブジェクトを作成します。オブジェクトID属性を使ってルビにオブジェクト 'o'を見つけさせる最善の方法は何でしょうか?私は何かの面で考えている

search_id = o.object_id
search_result = Object.find(search_id)

'search_results'は 'search_id'に対応するオブジェクトです。また、私は間違いなくオブジェクトのインデックスを作成し、GUIDなどでそれらを取得する全く別のアプローチに感謝します。本当にありがとう!

私は実際にはデータベースのコンテキストでこれについて考える必要があると思うし、単にMySQLクエリを使うか、オブジェクトを見つけるために選んだDBのものを使うだけです。もっと考えてみると、この想像上の 'find()'メソッドを使ってアクセスできる唯一のものは、新しく作成されたものか「アクティブ」なものでしょうか?これを冗談な質問にして申し訳ありません。

23

1 答え

はい、できます:

irb(main):002:0> s1 = "foo"
#=> "foo"
irb(main):003:0> s2 = ObjectSpace._id2ref(s1.object_id)
#=> "foo"
irb(main):004:0> s2.object_id == s1.object_id
#=> true
irb(main):005:0> s2[0] = "z"
#=> "z"
irb(main):006:0> s1
#=> "zoo"

あなたはこれをするべきですか?私はそれをあなたに任せます。シリアル化可能な id (たとえば、配列内でインデックスを返す)でオブジェクトを格納する方法はあまり奇妙ではありません。一つの問題は、あなたがオブジェクトに保持している唯一の '参照'が object_id なら、あなたが探していないときにGCによってオブジェクトを収集できるということです。

55
追加された
クラスによって作成されたすべてのインスタンスをクラス変数に保持すると、それらがガベージコレクションされるのを防ぐことができ、object_idを使用してそれらを参照することができます
追加された 著者 Tilo,
require 'objspace' - 非自明なこと....
追加された 著者 ribamar,
申し訳ありませんが、私はここに戻ってくるのにずっと時間がかかりました。これは間違いなく私の基本的な質問に答えました。私はちょっと混乱している二次的なものをそこに包み込んでいましたが、私はそれを自分で、あるいは別の質問で、ある時点で扱います。どうもありがとう!
追加された 著者 wuliwong,