Dave Thomas によるRuby オブジェクト モデルの講演で、Rubyには「クラス メソッド」はありません。メソッドの受け手が「クラスオブジェクト」か「インスタンスオブジェクト」かの違いだけです。
class Dave
def InstaceMethod ### will be stored in the current class (Dave)
puts "Hi"
end
class << self ### Creates an eigenclass, if not created before
def say_hello
puts "Hello"
end
end
end
デフォルトでは、ancestors
メソッドはメタクラスを表示しません:
class Dave
class << self
def metaclass ### A way to show the hidden eigenclass
class << self; self; end
end
end
end
p Dave.ancestors
# => [Dave, Object, Kernel, BasicObject]
p Dave.metaclass.ancestors
# => [Class, Module, Object, Kernel, BasicObject]
ただし、実際のものは次のようになると思います。
# => [<eigenclass>, Class, Module, Object, Kernel, BasicObject]
p Dave.class.instance_method(false)
# => [:allocate, :new, :superclass]
p Dave.metaclass.instance_method(false)
# => [:say_hello, :metaclass]
今、継承。
class B < Dave
end
p B.say_hello
# => "Hello"
p B.ancestors
# => [B, Dave, Object, Kernel, BasicObject]
p B.class.instance_methods(false)
# => [:allocate, :new, :superclass]
以下は、 の新しい固有クラスを作成しますB
。
p B.metaclass.ancestors
# => [Class, Module, Object, Kernel, BasicObject]
p B.metaclass.instance_method(false)
# => []
固有クラスも含まれている場合、 と はどのように見える
B.ancestors
でしょうか?B.metaclass.ancestors
メソッドsay_hello
は固有クラスに格納されていますが (B.class
継承元であると想定しています)、それはどこにあるのでしょうか?2 つの祖先チェーン (
B.ancestors
およびB.class.ancestors
またはB.metaclass.ancestors
) があるため、継承は実際にどのように行われるのでしょうか?