Подтвердить что ты не робот

Как использовать перечислимый 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

4b9b3361

Ответ 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