2014-09-29 241 views
0

我有兩個類。我想命名空間他們。我也有一些他們分享的功能。我這樣做:在模塊中包含模塊

module Talker 
    def say_bye 
    puts 'bye' 
    end 

    class Bob 
    include Talker 
    def say_yo 
     puts 'yo' 
    end 
    end 

    class Tom 
    include Talker 
    def say_hello 
     puts 'hello' 
    end 
    end 
end 

這些都是有效的方法調用。

Talker::Bob.new.say_yo 
Talker::Bob.new.say_bye 
Talker::Tom.new.say_hello 
Talker::Tom.new.say_bye 

有人告訴我:「這是include將再次包括Bob你應該開始一個類,包含Talker之前關閉Talker模塊。」有人可以向我解釋,如果我正在做的事情導致意外的紅寶石行爲或被視爲禁忌?在模塊內的類中包含一個像這樣的模塊是不好的做法?對這種模式可能有什麼批評?我應該在這裏使用繼承嗎?

+0

你確定'Bob.new.say_yo'等是否有效(來自主環境)? – sawa 2014-09-29 19:08:07

+0

您的示例不會產生您遇到的錯誤 – mdesantis 2014-09-29 19:30:10

+0

已編輯:調用不起作用,因爲我沒有在類前面的名稱空間。問題不是「爲什麼不這樣做」或「爲什麼它錯誤」?它的工作原理,沒有錯誤。問題是如果A)可以這樣做嗎?和B)它在幕後做了什麼我不知道的壞事? – 2014-09-29 22:02:51

回答

0

我想通了。包括最終有些遞歸。上面的代碼會做這樣的事情:

Talker::Bob::Bob 
Talker::Bob::Tom 
Talker::Bob::Bob::Bob::Tom::Bob::Tom 

而這並不是什麼東西。所以他說得對,他會說將會把模塊中的其他類重新包含到包含該模塊的每個類中。