Ответ 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
:
- Переопределить метод другим, определенным в модуле
- Когда обезьяна исправляет метод, вы можете вызвать переопределенный метод из новой реализации?
- Ruby: модуль, миксины и блоки запутываются?
(Примечание. Я упоминаю только методы, поскольку их легче всего представить, когда речь идет о наследовании и вставке, но то же самое относится к другим функциям.)