В чем разница между "include" и "preend" в Ruby?

Из Module

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

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

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

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

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

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

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

Ответ 1

  • Какие функции модуля определены как append и prepend?

Как указано в тексте, который вы указали:

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

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

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

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:

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