2014-01-16 137 views
2

我正在使用Zed Shaw的Learn Ruby The Hard Way,我在IRB中遇到了一個包含模塊的問題。在exercise 25中,我們定義了一個新的模塊Ex25,在IRB中需要它,然後可以通過該模塊的命名空間使用其各種方法,例如, Ex25.break_words(sentence)。在Extra Credit中,聲明鍵入include Ex25將基本上將模塊中的方法添加到當前「空間」(不知道該調用它的內容),然後可以在不明確指向模塊的情況下調用它們。 break_words(sentence)。但是,當我這樣做時,我得到一個「未定義的方法」錯誤。任何幫助/解釋將不勝感激,謝謝!Ruby在IRB中包含模塊

+0

向我們展示一些代碼。 –

+0

...包括什麼呼叫包含退貨,如果有的話。 –

回答

5

這是本書中的錯誤。 Ex25中的方法是方法。 include實例方法添加到「當前空間」。從方法定義刪除self,它會工作:

module Ex25 
    def break_words(stuff) 
    stuff.split(' ') 
    end 
end 

include Ex25 
break_words 'hi there' # => ["hi", "there"] 

如果你很好奇,這裏是什麼回事一些細節:其中的方法包括—「當前空間」的地方—是Object類:

Object.included_modules # => [Ex25, Kernel] 

所有對象實例獲得包括方法...

Object.new.break_words 'how are you?' # => ["how", "are", "you?"] 

...和頂級只是一個對象實例:

self.class # => Object 

但是等等。如果頂層是Object實例,爲什麼它會響應includeinclude是否爲Module(及其子類,Class)的實例方法?答案是頂層有一個單獨的方法...

singleton_methods.include? "include" # => true 

......我們可以假設它轉發到Object類。

+0

這工作完美,真的很有啓發性。非常感謝! – orenyk