2012-12-22 49 views
-1
class C 
    def aaa 
    print "aaa" 
    end 
end 

C.new.aaa 
# => "aaa" 

現在工作方法打印從模塊內核紅寶石內核:方法的行爲實例方法

Kernel.methods.grep /^print/ 
# => [:printf, :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] 

在內核中定義的方法。我可以只作爲實例方法覆蓋

module M 
    def print 
    "111" 
    end 
end 


M.instance_methods.grep /^print/ 
# => [:print] 

那麼kernel如何做到這一點?內核如何將類方法作爲實例方法?

回答

3
1.9.3-p327 :002 > Kernel.private_instance_methods.grep /^print/ 
=> [:printf, :print] 

instance_methods只給你的公共實例方法的列表。由於Kernel包含在Object中,因此它的私有實例方法是總是可用的,所以不需要將它們公開。

+0

哦,大謝謝!我不知道,私有方法不會顯示instance_methods。 – beornborn

+0

:)很高興幫助! –