Помимо обычных методов, массивы содержат большое число методов, работающих с блоками. Возьмем для примера метод sort()
. Он умеет сортировать только на основе сравнения значений. Такая сортировка сработает в случае простых массивов из чисел, но окажется бесполезной в большинстве реальных ситуаций, где процесс сортировки может быть хитрым. Пример (реальные значения могут быть другими):
# Население стран в тысячах человек
data = [
['france', 140_000],
['usa', 300_000],
['germany', 40_000]
]
Как отсортировать страны по количеству жителей в них? Для таких ситуаций и нужны функции высшего порядка:
# Внутрь передается блок,
# который принимает на вход элемент массива
data.sort_by { |row| row[1] }
# [
# ['germany', 40_000],
# ['france', 140_000],
# ['usa', 300_000]
# ]
# Либо, если кода много
data.sort_by do |row|
row[1]
end
Метод sort_by()
ожидает, что из блока вернётся значение, по которому нужно выполнить сортировку. Затем, когда значения собраны, этот метод выполняет сортировку, сравнивая значения с помощью оператора <=>
.
Вот некоторые примеры подобных функций:
-
max_by() – поиск максимального по указанному параметру в массиве
-
partition() – разделяет массив на два по указанному условию
Таких функций у массивов десятки. Единственный способ их запомнить – постоянно практиковаться и читать документацию.
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.