RubyにおけるClassクラス
クラスのクラス
クラスを定義するときによく使われる class 式は、Class.newを使って書き換え可能ってこと
code:rb
p Class.ancestors
A = Class.new do
def foo
'foo'
end
end
p A.new.foo # => "foo"
class B
def foo
'foo'
end
end
p B.new.foo # => "foo"
AとBは定義の方法が違うだけで、内容としては同じだね
AもBもClassクラスのインスタンス
Classクラスのインスタンスは、Classクラスの継承チェーンにあるものたちのインスタンスメソッドを呼べる
Classクラスの継承チェーンにあるものたち is [Class, Module, Object, Kernel, BasicObject]
たとえば上の例で A.ancestors とかを呼べているのは、Moduleクラスのインスタンスメソッドとして定義されているからだね
もちろんObjectクラスのインスタンスメソッドも呼べる。たとえば to_s とか
code:rb
A.to_s # => A
Objectクラス、Kernelモジュール、BasicObjectクラスは、Aクラスからも継承されている
[A, Object, Kernel, BasicObject]
なのでAクラスのインスタンスは、それらのクラス・モジュールのメソッドを呼べる
code:rb
つまり、たとえばObjectクラスにbarメソッドを生やしたら、Aクラスのクラスメソッドおよびインスタンスメソッドとして定義される、ということになる
code:rb
class Object
def bar
'bar'
end
end
p A.bar # => "bar"
p A.new.bar # => "bar"