2013-03-13 4 views
13

Из ModuleВ чем разница между «include» и «preend» в Ruby?

Модуля # append_features (мод) → мод => Когда этот модуль включен в другом, Ruby вызывает append_features в этом модуле, передавая его приемный модуль в модах. Реализация Ruby по умолчанию - - добавить константы, методы и переменные модуля этого модуля в mod, если этот модуль еще не был добавлен в мод или один из его предков.

Модуль # prepend_features (mod) → mod => Когда этот модуль добавлен в другой, Ruby вызывает prepend_features в этом модуле, передавая ему принимающий модуль в модуле. Реализация Ruby по умолчанию - , чтобы наложить константы, методы и переменные модуля этого модуля в mod, если этот модуль еще не был добавлен в мод или один из его предков.

Может кто-нибудь помочь мне понять следующие вопросы:

  • Какие еще особенности Module определяются как append и prepend, за исключением тех, кто по умолчанию?

  • Как они отличаются функционально?

  • Когда следует использовать append_features и когда prepend_features?

  • В чем разница между двумя жирными линиями, как указано выше?

ответ

19
  • Какие особенности модуля определяются как Append и препендом?

Как указано в тексте вы цитируемого:

константы, методы и переменные модуля

  • Как они функционально отличаются?

Оба добавляют методы смешанного модуля к переданному модулю (классу).Отличие состоит в том порядке поиска этих методов, в случае, когда целевой класс уже им определены:

include ведет себя так, как будто целевой класс наследуется смешанным в модуле:

module FooBar 
    def say 
    puts "2 - Module" 
    end 
end 

class Foo 
    include FooBar 

    def say 
    puts "1 - Implementing Class" 
    super 
    end 
end 

Foo.new.say # => 
      # 1 - Implementing Class 
      # 2 - Module 

prepend делает методы из смешанных в модуле «сильнее» и выполняет их первыми:

module FooBar 
    def say 
    puts "2 - Module" 
    super 
    end 
end 

class Foo 
    prepend FooBar 

    def say 
    puts "1 - Implementing Class" 
    end 
end 

Foo.new.say # => 
      # 2 - Module 
      # 1 - Implementing Class 

пример любезно сорван отсюда: http://blog.crowdint.com/2012/11/05/3-killer-features-that-are-coming-on-ruby-2-0.html

  • Когда использовать append_features и когда prepend_features?

Используйте prepend, если вы хотите сохранить методы целевого модуля (класса) в конце поисковой цепи метода.

некоторых реальных примеров можно найти с помощью поиска SO для ruby, module и prepend:

(Примечание: Я упоминаю только методы, поскольку их легче всего представить, когда дело доходит до наследования и смешивания , но то же самое относится к другим функциям.)

+0

'+ 1' вам. Как и в случае с doc 'Ruby по умолчанию, нужно добавить константы, методы и переменные модуля этого модуля. Теперь все в порядке. любые другие функции, кроме тех? –

+0

Хорошее объяснение, которое вы указали здесь. Не могли бы вы заглянуть в мой последний вопрос и обновить первые вопросы? –

+0

1) не более, (просто ?!) константы, методы и модульные вары. 4) по существу совпадает с 2) и объясняется на примере. –