2011-12-20 9 views
3

クラスメソッドで特定のクラスに対して作成したインスタンスの名前を取得する方法はありますか?インスタンス名を取得

これは私がやろうとしているものです:モジュールの第三に、最後の行に

module MyObjectStore 
    values = {} 
    temp= {} 
    define_method :add_check_attribute do |method,*args| 
    if method.to_s =~ /=$/ 
     temp[method[0..-2]] = args[0] 
    else 
     instance_variable_get("@#{method}") 
    end 
    end 
    define_method :method_missing do |method,*args| 
    add_check_attribute(method,*args) 
    end 
    define_method :save do 
    temp.each {|key,value| instance_variable_set("@#{key}",value)} 
    values[self] = temp 
    end 
end 

class C 
    include MyObjectStore 
end 

a = C.new 
a.id = 1 
a.name = 'gaurav' 
a.save 

、私は持つ新しいハッシュにオブジェクトの値を格納しようとしていますインスタンス名をキーとして使用します。

可能なことはありますか?

私は現在selfを使用していますが、インスタンス名ではなくオブジェクト全体を提供しています。

答えて

6

Rubyオブジェクトには、メモリアドレスの他に名前がありません。各オブジェクトには、常にユニークなobject_idがあります。 ObjectSpace._id2refを使用すると、インスタンスとIDを交換することができます。ここで は例です:

id="Hello, World".object_id => 82609910 
ObjectSpace._id2ref(id)  => "Hello, World" 
"Hello, Ruby".object_id  => 82721540 

オブジェクトIDは、その生涯にわたるオブジェクトの定数が、それはほとんどない一定のプログラムの実行、および正確に同じデータを持つ異なるオブジェクト間ではないことを言及する価値があります異なるIDを持っています:

"Hi".object_id     => 82719050 
"Hi".object_id     => 82715090 

オブジェクトIDも、あなただけはobject_idを通じて得たIDを使用し、ソースコードに決してハードコードオブジェクトIDなど、依存やOSに依存する実行されます。

+0

グレートマン、 これは私が探していたものです。ありがとう、トン! –

+0

確かに。お役に立てて嬉しいです。 – Linuxios

2

インスタンス名はどのようにする必要がありますか?特定の属性(nameなど)について話している場合を除き、インスタンスには実際に名前がありません。 という名前が付いていますが、2つは区別されます。

ので:

  • オブジェクトは、いくつかのメモリハンドルまたはインタプリタによって使用される同様のメカニズムを除いて、「名前」を持っていません。
  • 変数は名前を持ちますが、プログラムの実行中に異なるインスタンスを参照することができます。
  • 異なる変数が同じインスタンスを参照することがあります。

最後に、インスタンスがどのように「名前」を決定すべきかを考えます。

この問題を解決する1つの方法は、オブジェクト名としてメモリアドレスまたは何らかの種類のハッシュ関数を使用することです。ハッシュ関数は、オブジェクトが変化するにつれて変化するので、ややこしい。

すべてのインスタンスにidまたはnameフィールドを設定して使用することもできます。それをユニークに保つ。それを保障してください。気が狂う。戻ってきてください。私達に教える。

+0

上記のコードと同様に、私はクラスCのインスタンスとして** a **を持っています。 この値 "a"をハッシュのキーとして使用したいと思います。 –

+0

@Gaurav Manchanda 'a'はクラス' C'のインスタンスを単に参照するインスタンスではありません。 – Howard

+0

@ GauravManchanda、あなたはhsh.merge({a.name => a})をやろうとしていますが、そのオブジェクトのname属性によってオブジェクトへのポインタを持っています! –

関連する問題