Ruby 「putsがクラスメソッドの中で使用できる理由」
解決したいこと
クラスメソッドの中で「puts」が使える理由がわかりません。
リファレンスにある、Rubyの「ObjectクラスはKernelモジュールをincludeしている」より、インスタンスメソッドの中で使える理由はわかるのですが、クラスメソッドの中でも使える理由がわかりません。
現時点の認識として
・includeしたモジュールのメソッドはインスタンスメソッドとして継承と同じように使える
・extendしたモジュールのメソッドはクラスメソッドとして継承と同じように使える(厳密には特異メソッドというべきかもしれないですが)
という認識を持っています。
その為、「ObjectクラスはKernelモジュールをincludeに加えてextendもする必要がある」のではないかと考えております。
仮説1
Kernelモジュールの中で、「module_function :puts」でモジュール関数としてputsを指定することで、クラスメソッドの中で「Kernel.puts」を呼び出している。
しかし、クラスメソッドの中で「self.puts」でも呼び出せるのはなぜでしょうか?
この場合のselfは「MyClass」となりエラーにならないのでしょうか?
class MyClass
def self.class_method
self.puts("練習")
end
end
MyClass.class_method #=>練習
仮説2
puts以外のケースで試した場合にはエラーになる為、モジュール関数というよりもObjectクラス自体に何か特殊な仕掛けがあるのではないかと思いました。
例えば、ObjectクラスへのincludeはObjectクラスの特異クラスへのincludeも兼ねるなど。
module MyModule
def instance_method
puts "This is an instance method from MyModule"
end
module_function :instance_method
end
class MyClass
include MyModule
def self.class_method
instance_method
end
end
MyClass.class_method #=>エラー
参照にしたリファレンス