6

Well Grounded Rubyist を読んでいて、クラスがそのスーパークラスのインスタンスメソッドを継承して、クラスのオブジェクトがそれらのインスタンスメソッドを呼び出せるようにする方法について言及しています。次に例を示します。

class C
  def run_instance_method
    puts "This is an instance method."
  end
  def C.run_class_method
    puts "This is a class method."
  end
end

class D < C
end

私が読んだことに基づいて、クラス D はクラス C のインスタンス メソッドのみを継承することが常に説明されています (この場合、C::run_class_method は D によって継承されません)。ただし、上記のコードを実行した後、次のことに気付きました。

D.run_class_method # => "This is a class method."

これがなぜ起こっているのかについての私の推測です。これが正しい理解であるかどうか教えてください。クラス D のインスタンス d があり、d.run_instance_method を実行しようとすると、そのオブジェクトはメソッド ルックアップ パスを検索し、そのメソッドがシングルトン クラス、独自のクラス、またはスーパークラスで定義されているかどうかを確認します。run_instance_method はクラス C で定義されているため、問題は発生せず、run_instance_method が呼び出されます。クラス オブジェクト D (C およびオブジェクトのサブクラス) の場合、D.run_class_method が呼び出されると、D クラス オブジェクトのメソッド ルックアップ パスが再度チェックされます。繰り返しますが、Ruby はクラス オブジェクト C でそれを見つけます。

この推論は正確ですか?

4

2 に答える 2

6

Class methods may be inherited and overridden just as instance methods can be. If your parent class defines a class method, the subclass inherits that method. That is, if your subclass does not define it's own class method, then it inherits from it's superclass.

As a recommendation: when invoking a class method with an explicit receiver, you should avoid relying on inheritance. Always invoke the class method through the class that defines it. Otherwise, it would be very difficult for someone who relies on your code to find the parent class which defines the class method.

Referring back to your original assumption: the invocation of a class method from a subclass it's possible because the class methods are instance methods of the eigenclass.

class C
   # instance methods goes here
   class << self # open the eigenclass
   # class methods go here as instance methods of the eigenclass
   end
end

In general, it's clearer to define class methods as individual singleton methods without explicitly opening the eigenclass.

For a clear explanation read The Ruby Programming Language by David Flanagan and Yukihiro Matsumoto

于 2013-02-17T08:05:43.293 に答える
2

あまり正確ではありません。ここにはmetaclassorと呼ばれる別の概念が隠されていますeigenclass。class メソッドは eigenclass から継承されます。詳細については、 Ruby Hacking Guideを参照してください。(すべてを読みたくない場合は、ページ内で「クラス メソッド」を検索してください。)

于 2013-02-17T07:19:42.753 に答える