2014-09-29 200 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 

而这并不是什么东西。所以他说得对,他会说将会把模块中的其他类重新包含到包含该模块的每个类中。