class C
def aaa
print "aaa"
end
end
C.new.aaa
# => "aaa"
モジュール Kernel からメソッド print が機能するようになりました
Kernel.methods.grep /^print/
# => [:printf, :print]
これは、このメソッドがクラス メソッドとして定義されていることを意味します。
カーネルにはインスタンス メソッド print がありません
Kernel.instance_methods.grep /^print/
# => []
最初の質問は、そのクラス メソッドがオブジェクト レシーバーから呼び出されるのはどうしてでしょうか? (C.new)
また、私は自分のモジュールで同じトリックを試みました:
module M
def self.print
"111"
end
end
class C
include M
def aaa
print
end
end
C.new.aaa
# => nil
ほら、これもカーネルモジュールです
しかし、階層ツリーは次のとおりです。
C.ancestors
# => [C, M, Object, Kernel, BasicObject]
M.methods.grep /^print/
# => [:print]
Kernel で定義されているメソッド。インスタンスメソッドとしてのみオーバーライドできます
module M
def print
"111"
end
end
M.instance_methods.grep /^print/
# => [:print]
では、カーネルはどのようにこれを行うのですか? カーネルはクラスメソッドをインスタンスメソッドとしてどのように配置しますか?