2011-07-21 9 views
0

私はルビーのシングルトンを学習し、そのようなコードを誤解している取得:ない class_singletonクラスのクラス方法が含まれており、object_singleton代わりオブジェクトのシングルトンメソッドを含んでいるのはなぜRubyのクラスとオブジェクトのシングルトン - アクセス

class MyClass 
    def self.class_singleton_mymethod 
    end 
end 

class_singleton = class << MyClass 
    self 
end 

puts class_singleton.methods.grep(/mymethod/) # => [] 


obj = MyClass.new 

def obj.object_singleton_mymethod 
end 

object_singleton = class << obj 
    self 
end 

puts object_singleton.methods.grep(/mymethod/) # => class_singleton_mymethod 

をクラスクラスメソッド?

答えて

2

それを含めます。 methodsのすべてのインスタンスをinstance_methodsに置き換えると、期待した結果が表示されます。

instance_methodsは、クラスのインスタンスが持つメソッドを列挙するために使用されます。 methodsは、オブジェクトが持つメソッドを列挙するために使用されます。 (Classオブジェクトがあまりにもオブジェクトであり、インスタンスメソッドではありませんnewのような、独自のメソッドを持って

例えば、String#sliceはインスタンスメソッドである;。。あなたは、文字列にインスタンスをsliceを呼び出すことができます一方、String.newがありますString自体の方法は、あなたが文字列のインスタンス上newを呼び出すことはありませんが、あなたは呼び出すことができますString.new(すなわち、Stringクラスオブジェクト自体に)新しい文字列を作成する)

+1

明確な答えをありがとう! –

+0

@Vladimir:ありがとう、私はそれを正しくしようと2つの試みが必要でしたが、私は私が満足して答えを持ってうれしいです。 :-) –

0

私は理解していませんが、シングルトンデザインパターンを実装しようとしていますか?

は、それはあなたのためのアジサシを実装Singleton Moduleを使用して、あなただけの私はあなたがmethodsと混同instance_methodsの概念を持っていると思う

+0

-1 Rubyで第シングルトンクラスを持っています。シングルトンパターンとは関係ありません。 –

+0

私は 'class_singleton'(MyClassのSinletonオブジェクトを含む)がMyClassのシングルトンメソッドを内部に持たない理由を理解しようとしています –

+0

彼はRubyのシングルトンクラス/固有クラスについて話しています。名前はちょっと混乱しますが、基本的にすべてのオブジェクトはクラス階層のクラスのすぐ下にユニークなシングルトンクラスを持っています。 – Chuck