4

次のコードをオブジェクトに追加すると、任意のオブジェクトのシングルトン クラスを取得できるようになります。

class Object
    def singleton_class
        class << self; self; end
    end
end

この方法でインスタンス化したPowerballクラスがありました

puts Powerball.new.singleton_class
puts Powerball.new.singleton_class
puts Powerball.singleton_class
puts Powerball.singleton_class

それは私にこの出力を与えました

#<Class:#<Powerball:0x007fd333040548>>
#<Class:#<Powerball:0x007fd333040408>>
#<Class:Powerball>
#<Class:Powerball>

そのため、powerball クラスの 2 つのインスタンスには一意の ID がありますが、クラスで直接 singleton_class を呼び出してもオブジェクト ID は生成されません。

質問

  1. 各インスタンスにはシングルトン クラスがあるため、ID は一意ですか?

  2. selfクラス内ではクラス、つまり Class:Powerball が返されることは理解していますが、クラスはオブジェクトであるため、id も持つべきではありませんか? そのIDにアクセスする方法はありますか?

4

1 に答える 1

2

シングルトン クラスがインスタンスに属していることを理解する必要があります。コード内の最初の 2 つのシングルトンは、2 つの異なる Powerball インスタンスに属していました。(はい、各インスタンスには独自のシングルトン クラスがあります。単一のインスタンスだけが属するため、シングルトンと呼ばれます。) 3 番目と 4 番目のシングルトンは同じで、Powerball クラス自体のシングルトン クラスです。どちらの場合も同じオブジェクト。

自分で調べてみませんか。

class Kokot; end
puts Kokot.object_id
puts Kokot.singleton_class.object_id

また、Ruby 1.9.x では #singleton_class が組み込みメソッドになっています。

于 2013-01-03T04:08:52.050 に答える