В чем разница между модулями и встраиваемыми модулями? - PullRequest
0 голосов
/ 20 января 2009
module Superpower

    # instance method
    def turn_invisible
        ...
    end

    # module method
    def Superpower.turn_into_toad
        ...
    end

    module Fly
        def flap_wings
            ...
        end
    end

end

Class Superman
    include Superpower
    ...

    def run_away
        # how to call flap_wings?
        # how to call turn_invisible?
    end

    def see_bad_guys(bad_guy = lex_luthor)
        #is this correct?
        Superpower.turn_into_toad(bad_guy)
    end
end

Привет, я увидел какой-то рубиновый код, который не мог понять. Как вы вызываете flap_wings из класса Супермена? Можно ли вызвать метод экземпляра из класса? В чем разница между включением модулей и внедрением модулей? Почему и когда вы должны это сделать?

Ответы [ 2 ]

2 голосов
/ 20 января 2009

Я предполагаю, что когда вы говорите «встраивание модуля», вы подразумеваете, что модуль «Fly» из вашего примера встроен в «Superpower».

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

Вы можете использовать методы вложенного модуля, просто включив сначала супердержаву, а затем полететь вторым, вот так:

Class Superman
    include Superpower
    include Fly
    # ...
end

Подробности описаны далее в этом блоге .

1 голос
/ 20 января 2009

Вы хотите прочитать документацию по миксинам, которая позволяет обойти тот факт, что у Ruby есть только одно наследование. Включая данный модуль A в класс B, все методы модулей в A становятся доступными, как если бы они были частью класса B.

Это означает, что звонить turn_invisible так же просто, как

def run_away
  turn_invisible
end

Для flap_wings, как в другом пространстве имен, это может быть так же просто, как:

def fly_away
  Fly.flap_wings
end

но я не пытался завершить ваш код и "запустить" его.

Миксины объясняются здесь и там .

...