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 でそれを見つけます。
この推論は正確ですか?