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

+0

Ваш пример не вызывает ошибки, которые вы получаете – mdesantis

+0

Отредактировано: Call не работает, потому что у меня не было пространства имен перед классами. Вопрос не в том, «почему это не работает» или «почему это ошибка»? Он работает и без ошибок. Вопросы в том, что если A) это нормально? И Б) это что-то плохое, я не знаю, что за кулисами? –

ответ

0

Я понял. Включение оказывается несколько рекурсивным. В приведенном выше коде будут делаться такие вещи:

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

И это не то, что нужно. Поэтому он был прав, когда сказал, что снова включит другие классы в модуль в каждый класс, который включает модуль.

Смежные вопросы