Подключение 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 — локальная установка не требуется.
Все уроки этого курса
- Написание собственного each
- Подключение Enumerable
- Ленивые перечислители
- Объекты Enumerator