Как использовать перечислимый mixin в моем классе?
У меня есть класс под названием Note
, который включает переменную экземпляра, называемую time_spent
. Я хочу иметь возможность сделать что-то вроде этого:
current_user.notes.inject{|total_time_spent,note| total_time_spent + note.time_spent}
Возможно ли это путем смешивания в Enumerable module? Я знаю, что вы должны добавить класс include Enumerable
в класс, а затем определить метод each
, но должен ли каждый метод быть методом класса или экземпляра? Что входит в метод each
?
Я использую Ruby 1.9.2
Ответы
Ответ 1
Легко, просто включите модуль Enumerable
и определите метод экземпляра each
, который чаще всего будет использовать какой-либо другой метод класса each
. Здесь действительно упрощенный пример:
class ATeam
include Enumerable
def initialize(*members)
@members = members
end
def each(&block)
@members.each do |member|
block.call(member)
end
# or
# @members.each(&block)
end
end
ateam = ATeam.new("Face", "B.A. Barracus", "Murdoch", "Hannibal")
#use any Enumerable method from here on
p ateam.map(&:downcase)
Для получения дополнительной информации я рекомендую следующую статью: Ruby Enumerable Magic: Основы.
В контексте вашего вопроса, если то, что вы открываете через аксессор, уже является коллекцией, вам, вероятно, не нужно беспокоиться о включении Enumerable
.
Ответ 2
В документах Enumerable указано следующее:
Перечисляемый mixin предоставляет классы сбора с несколькими методы обхода и поиска, а также возможность сортировки. The класс должен обеспечивать каждый метод, который дает последовательные члены Коллекция. Если используется Enumerable # max, #min или #sort, объекты в коллекции также должен быть реализован осмысленный оператор <= > , поскольку эти методы зависят от упорядочения между членами коллекции.
Это означает, что каждый из них и <= > выполняет трюк.
Смотрите: Enumerable