0Pricing
Ruby Academy · Урок

Подключение Enumerable

Получайте map/select бесплатно

«Подключение Enumerable» — бесплатный урок Ruby Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Ruby Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Ruby Academy содержит 4 уроков всего.

Получаем map/select бесплатно

После того как в Вашем классе появился each, подключение модуля перечисления сразу предоставляет map, select, reduce, sort, min, max и многие другие методы, построенные на основе Вашего each.

class Bag
  include Enumerable
  def initialize(*x); @x = x; end
  def each; @x.each { |i| yield i }; end
end
p Bag.new(1, 2, 3).map { |n| n * 10 }

Контракт

Правило простое: подключите Enumerable и определите each. Enumerable внутри вызывает Ваш each, чтобы обеспечить работу всех остальных возможностей.

class Squares
  include Enumerable
  def initialize(n); @n = n; end
  def each
    (1..@n).each { |i| yield i * i }
  end
end
p Squares.new(5).to_a

Фильтрация с помощью select

select оставляет элементы, для которых блок возвращает истинное значение. reject делает обратное.

class Nums
  include Enumerable
  def initialize(*x); @x = x; end
  def each; @x.each { |i| yield i }; end
end
n = Nums.new(1, 2, 3, 4, 5, 6)
p n.select(&:even?)
p n.reject(&:even?)

Агрегация с помощью reduce

reduce сворачивает коллекцию в одно значение.

class Cart
  include Enumerable
  def initialize(*p); @p = p; end
  def each; @p.each { |i| yield i }; end
end
puts Cart.new(5, 10, 15).reduce(:+)

Минимум, максимум и сортировка

Методы, основанные на сравнении, работают, если элементы можно сравнивать.

class Scores
  include Enumerable
  def initialize(*n); @n = n; end
  def each; @n.each { |i| yield i }; end
end
s = Scores.new(7, 2, 9, 4)
puts s.min
puts s.max
p s.sort

Поиск и проверка принадлежности

find возвращает первый подходящий элемент, а include? проверяет принадлежность.

class Words
  include Enumerable
  def initialize(*w); @w = w; end
  def each; @w.each { |x| yield x }; end
end
w = Words.new("cat", "dog", "bird")
puts w.find { |x| x.length == 4 }
puts w.include?("dog")

group_by и partition

Enumerable предоставляет мощные средства группировки.

class Nums
  include Enumerable
  def initialize(*x); @x = x; end
  def each; @x.each { |i| yield i }; end
end
n = Nums.new(1, 2, 3, 4, 5)
p n.group_by(&:even?)
p n.partition(&:odd?)

Для сортировки нужны сравнимые элементы

Если Ваши элементы являются пользовательскими объектами, предоставьте им <=> (через модуль сравнения), чтобы sort, min и max знали, как упорядочить их.

Item = Struct.new(:price) do
  include Comparable
  def <=>(o); price <=> o.price; end
end
class Shelf
  include Enumerable
  def initialize(*i); @i = i; end
  def each; @i.each { |x| yield x }; end
end
shelf = Shelf.new(Item.new(30), Item.new(10), Item.new(20))
p shelf.min.price

Итерация с индексом

Enumerable также предоставляет each_with_index и each_with_object для более гибкой итерации.

class Letters
  include Enumerable
  def initialize(*l); @l = l; end
  def each; @l.each { |x| yield x }; end
end
Letters.new("a", "b", "c").each_with_index do |letter, i|
  puts "#{i}: #{letter}"
end

Объединение методов в цепочку

Поскольку эти методы возвращают массивы или перечислители, Вы можете объединять их в выразительные цепочки.

class Nums
  include Enumerable
  def initialize(*x); @x = x; end
  def each; @x.each { |i| yield i }; end
end
result = Nums.new(1, 2, 3, 4, 5, 6).select(&:even?).map { |n| n * n }
p result

Собираем всё вместе

Подключение модуля перечисления даёт огромные преимущества:

  • Один раз определите each.
  • Получите map, select, reduce, сортировку, поиск, group_by и ещё десятки методов.
  • Добавьте элементам модуль сравнения, чтобы использовать методы упорядочивания.
class Range5
  include Enumerable
  def each; (1..5).each { |n| yield n }; end
end
puts Range5.new.sum

Быстрая проверка

Проверьте, насколько хорошо Вы поняли подключение Enumerable.

Повторение

Вы научились подключать Enumerable:

  • Определите each, подключите модуль и получите полный набор инструментов.
  • map, select, reduce, поиск и group_by работают на основе Вашего each.
  • Для упорядочивания элементов нужен <=>.
  • Методы можно объединять в цепочки.
class Tens
  include Enumerable
  def each; [10, 20, 30].each { |n| yield n }; end
end
p Tens.new.map { |n| n + 1 }

Часто задаваемые вопросы

Урок «Подключение Enumerable» бесплатный?

Да — полный текст урока «Подключение Enumerable» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Ruby Academy, подпишись на CoddyKit PRO. Курс Ruby Academy содержит 4 уроков всего.

Чему я научусь в уроке «Подключение Enumerable»?

Получайте map/select бесплатно Ты практикуешь Ruby Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Ruby Academy?

Предыдущий опыт не требуется. Ruby Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Подключение Enumerable»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Ruby Academy?

Да. Каждый урок Ruby Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Написание собственного each
  2. Подключение Enumerable
  3. Ленивые перечислители
  4. Объекты Enumerator
← Назад к Ruby Academy