2011-11-25 2 views
22

私は新しいオブジェクトを作る、のは私もObjectクラスを使用して、いくつかの他のオブジェクトを作る私はrubyのobject_id属性でオブジェクトを見つけることができますか?

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

このオブジェクトはIDを持っている

o = Object.new 

、としましょう。オブジェクトID属性を使ってルビにオブジェクト 'o'を見つけさせる最善の方法は何でしょうか?

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

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

答えて

53

はい、できます:

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(Arrayやインデックスを返すなど)にはあまりありません。 1つの問題は、オブジェクトに保持されている唯一の '参照'がobject_idである場合、探していないときにGCでオブジェクトを収集できることです。

+0

申し訳ありませんが、私はここまで戻ってくるのにとても時間がかかりました。これは間違いなく私の基本的な質問に答えました。私はちょっと混乱している二次的なものをそこに包み込んでいましたが、私はそれを自分で、あるいは別の質問で、ある時点で扱います。どうもありがとう! – wuliwong

+1

彼がクラス変数で作成したすべてのインスタンスをクラス変数に保存すると、ガベージコレクションができなくなる可能性があり、object_idを使用して – Tilo

+0

'require require 'objspace'' - non trivial .... – ribamar

関連する問題