2016-09-27 73 views
3

我在學Ruby,最近發現了一些我不太明白的東西。在將模塊混入類中時,類對象無法訪問模塊實例方法。爲什麼類對象有權訪問內核模塊中的實例模塊?

module Swimmable 
    def swim 
    puts 'can swim' 
    end 
end 

class Fish 
    include Swimmable 
end 

Fish.swim 

結果是undefined method 'swim' for Fish:Class (NoMethodError)預計

然而,如果實例方法是內核模塊中定義的,我可以使用的類對象,實例對象訪問它。

module Kernel 
    def swim 
    puts 'can swim' 
    end 
end 

class Fish; end 

Fish.swim # => can swim 
Fish.new.swim # => can swim 

是什麼讓類對象Fish能夠訪問內核模塊中的實例方法?

+0

如果您希望'Swimmable'對類對象可用,請在'Fish'中寫入'將Swimmable'擴展。這樣你就不需要在'Kernel'中定義模塊。更多閱讀搜索詞:_singleton class_ –

回答

1

the documentation

內核模塊是由類對象包括在內,所以它的方法在每一個Ruby對象是可用的。

兩個Fish實例和Fish類本身是對象,所以他們在Kernel定義的所有方法。

在第一種情況下,你的錯誤,因爲包括SwimmableFish將就的Fish實例可用Swimmable成員,但不是在類本身。

+0

感謝您的解釋,它只是讓我更深入地理解'Class'和'Object'。基本上,類對象中的任何實例方法都可用於每個「類對象」和「實例對象」。 –