5

クラスのインスタンス化を(シングルトンを使用せずに)単一のものに制限しようとしていましたが、できませんでした。クラス変数 (@@) を試してみましたが、うまくいきませんでした。私はそれをグーグルで検索し、これに出くわしました:

class A 
  @count = 0 

  class << self 
    attr_accessor :count 
  end

  def initialize val 
    @a = val 
    self.class.count += 1 
  end 
end 

a=A.new 42 
b=A.new 43

'class << self ' の説明を検索して、より良い (または単純でクリーンな) ものを見つけようとしましたが、うまくいきませんでした。最後に、いくつかのテストの後、 「class << self 」は、クラスメソッドを定義できる単なるブロック ラッパーであると結論付けました。それで、これは正しいですか?

よろしく!

4

4 に答える 4

35

このclass << self表記は、オブジェクトの固有クラスを開きます。固有クラスは、インスタンス固有の動作を格納する匿名クラスです。クラスの場合、固有クラスはメタクラスと呼ばれることがあります。

Ruby は固有クラスを使用して、いわゆる「クラス メソッド」(静的メソッドとも呼ばれます) を実装します。

クラス (モリッツが述べたように) は Ruby のオブジェクトでもあり、それがオブジェクトである限り、クラスも持ちます。Ruby のクラスのクラスは と呼ばれClassます。

どの言語でも「クラス メソッド」は、クラスがレシーバーであるメソッドです。つまり、メソッドはクラス自体で直接呼び出されます。

ただし、レシーバーでメソッドを呼び出すには、そのメソッドをそのレシーバーのクラスで定義する必要があります。クラスの場合、「クラス メソッド」はクラスのインスタンス メソッドとして実装できClassます。

しかし、インスタンス メソッドを on に定義するClassと、すべてのクラスがそのクラス メソッドにアクセスできるようになり、理想的ではありません。

前述のように、固有クラスを入力します。オブジェクトの固有クラスは、そのオブジェクトに固有のメソッドを格納する特別なクラスです。クラスの場合、固有クラスはクラスをサブクラス化し、Classクラスの直接のクラスです。

したがって、Ruby の「クラス メソッド」は、クラスの固有クラスで定義された単なる「インスタンス メソッド」です。

このdef MyClass.my_method表記は、実際にはmy_methodMyClass の固有クラスで定義されています。この表記法を使用すると、(しばらくの間) 固有クラスを実際に理解していなくても、Ruby の「静的メソッド」を定義する方法に過ぎないと思い込ませ、Ruby のクラス モデルは Java のクラス モデルに似ていると考え続けることができるため、(しばらくの間) やっていくことができます。ただし、class << self表記法ではそのような解釈は許可されておらず、固有クラスの現実を受け入れる必要があります。

要約すると、「クラス メソッド」は実際には固有クラスで定義された「インスタンス メソッド」であり、固有クラスclass << selfへのアクセスを提供します。

詳細については、次のリンクをご覧ください。

http://banisterfiend.wordpress.com/2008/11/25/a-complete-ruby-class-diagram/

http://banisterfiend.wordpress.com/2008/10/25/the-secret-life-of-singletons/

http://www.klankboomklang.com/2007/09/21/the-singleton-class/

于 2010-01-08T06:52:41.173 に答える
5

技術的には、クラス自体ではなく、クラスのメタクラスでメソッドを定義しています。Yehuda Katz が Ruby のメタクラスについて詳しく説明しています: http://yehudakatz.com/2009/11/15/metaprogramming-in-ruby-its-all-about-the-self/

于 2010-01-08T05:39:07.537 に答える
3

件名が質問の本文と完全に一致していません。件名に記載されている質問に対処します。

それらは同義です。

def self.foo
    ...
end

の省略形です

class << self
    def foo
        ...
    end
end
于 2012-02-19T08:45:30.370 に答える
2

あなたの結論は正しいです。基本的には、Ruby ではクラスもオブジェクトなので、インスタンスを持つことを念頭に置いておく必要があります。class << self ステートメントを使用すると、オブジェクトのそのクラス インスタンスを変更するだけです。

于 2010-01-08T04:54:23.207 に答える