class C
def aaa
print "aaa"
end
end
C.new.aaa
# => "aaa"
现在从模块内核工作方法打印
Kernel.methods.grep /^print/
# => [:printf, :print]
这意味着,该方法定义为类方法。
内核没有实例方法打印
Kernel.instance_methods.grep /^print/
# => []
所以第一个问题是:怎么会从对象接收者调用类方法?(C.新)
我也尝试用自己的模块做同样的把戏:
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]
方法在内核中定义。我只能作为实例方法覆盖
module M
def print
"111"
end
end
M.instance_methods.grep /^print/
# => [:print]
那么内核如何做到这一点?内核如何将类方法作为实例方法?