質問

Ruby のシングルトン クラスはそれ自体がクラスですか?それがすべてのオブジェクトが「クラス」に属する理由ですか?コンセプトはです ファジー, 、しかし、それはなぜクラスメソッドを定義できるのかに関係があると思います(class foo; def foo.bar ...).

Rubyのシングルトンクラスとは何ですか?

役に立ちましたか?

解決

まず、小さな定義:シングルトンメソッドは、単一のオブジェクトに対してのみ定義されるメソッドです。例:

irb(main):001:0> class Foo; def method1; puts 1; end; end
=> nil
irb(main):002:0> foo = Foo.new
=> #<Foo:0xb79fa724>
irb(main):003:0> def foo.method2; puts 2; end
=> nil
irb(main):004:0> foo.method1
1
=> nil
irb(main):005:0> foo.method2
2
=> nil
irb(main):006:0> other_foo = Foo.new
=> #<Foo:0xb79f0ef4>
irb(main):007:0> other_foo.method1
1
=> nil
irb(main):008:0> other_foo.method2
NoMethodError: undefined method `method2' for #<Foo:0xb79f0ef4>
        from (irb):8

インスタンスメソッドは、クラスのメソッドです(つまり、クラスの定義で定義されています)。クラスメソッドは、クラスのClassインスタンスのシングルトンメソッドです。クラスの定義では定義されていません。代わりに、オブジェクトのシングルトンクラスで定義されます。

irb(main):009:0> Foo.method_defined? :method1
=> true
irb(main):010:0> Foo.method_defined? :method2
=> false

構文class << objでオブジェクトのシングルトンクラスを開きます。ここで、このシングルトンクラスはシングルトンメソッドが定義されている場所であることがわかります。

irb(main):012:0> singleton_class = ( class << foo; self; end )
=> #<Class:#<Foo:0xb79fa724>>
irb(main):013:0> singleton_class.method_defined? :method1
=> true
irb(main):014:0> singleton_class.method_defined? :method2
=> true
irb(main):015:0> other_singleton_class = ( class << other_foo; self; end )
=> #<Class:#<Foo:0xb79f0ef4>>
irb(main):016:0> other_singleton_class.method_defined? :method1
=> true
irb(main):017:0> other_singleton_class.method_defined? :method2
=> false

したがって、シングルトンメソッドをオブジェクトに追加する別の方法は、オブジェクトのシングルトンクラスを開いてメソッドを定義することです。

irb(main):018:0> class << foo; def method3; puts 3; end; end
=> nil
irb(main):019:0> foo.method3
3
=> nil
irb(main):022:0> Foo.method_defined? :method3
=> false

要約:

  • メソッドは常にクラスに属している必要があります(または、あるクラスのインスタンスメソッドである)
  • 通常のメソッドは、それらが定義されているクラスに属します(つまり、クラスのインスタンスメソッドです)
  • クラスメソッドは、<=>
  • のシングルトンメソッドです。
  • オブジェクトのシングルトンメソッドは、オブジェクトのクラスのインスタンスメソッドではありません。むしろ、それらはオブジェクトのシングルトンクラスのインスタンスメソッドです。

他のヒント

Rubyは、特定のオブジェクトに固有のメソッドを定義する方法を提供します。このようなメソッドはシングルトンメソッドと呼ばれます。オブジェクトでシングルトンメソッドを宣言すると、Rubyはシングルトンメソッドのみを保持するクラスを自動的に作成します。新しく作成されたクラスは、シングルトンクラスと呼ばれます。


    foo = Array.new
    def foo.size
      "Hello World!"
    end
    foo.size  # => "Hello World!"
    foo.class # => Array
    #Create another instance of Array Class and call size method on it
    bar = Array.new
    bar.size  # => 0
シングルトンクラスは、自動的に作成されて継承階層に挿入されるオブジェクト固有の匿名クラスです。

singleton_methodsをオブジェクトで呼び出して、オブジェクトのすべてのシングルトンメソッドの名前のリストを取得できます。

    foo.singleton_methods  # => [:size]
    bar.singleton_methods  # => []

この記事は、Rubyのシングルトンクラスを理解するのに非常に役立ち、コードも優れています。例。

@Pistosの回答を更新するだけで、バージョン1.9.2のrubyからシングルトンクラスの取得に新しい構文が追加されます

 singleton_class = ( class << foo; self; end )

は次のように置き換えることができます。

singleton_class = foo.singleton_class

https://apidock.com/ruby/Object/singleton_class

最も実用的でアクション重視の方法(IMHO)は、継承チェーン、またはメソッド検索/解決順序です。この写真が役に立つかもしれません

http:// www.klankboomklang.com/2007/11/25/modules-part-i-enter-the-include-class/

これはr 1.9であり、組み込みクラスとユーザー定義クラスの対比です:まだこれを消化しています。

http://d.hatena.ne.jp/sumim/20080111/p1

また、この用語の混乱を招く使用法は<!> quot; Singleton object <!> quot;であり、これは異なる概念です。シングルトンオブジェクトは、コンストラクタ/インスタンス化メソッドがオーバーライドされているクラスから取得されるため、そのクラスの1つのみを割り当てることができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top