Программирование на языке Ruby
Шрифт:
Данный пример не слишком полезен и, конечно, его можно было бы записать более компактно. Но идея в том, что для сравнения двух операндов в определенном порядке над ними можно выполнять произвольно сложный набор операций. (Отметим, однако, что мы не изменили исходные операнды, так как работали с их копиями.) Эта общая техника полезна во многих ситуациях, например для сортировки по нескольким ключам или по ключам, вычисляемым во время выполнения.
В последних версиях Ruby в модуль
В методе
В качестве искусственного примера рассмотрим список файлов, который необходимо отсортировать по размеру. Прямолинейный способ выглядит так:
Однако тут есть две проблемы. Во-первых, слишком многословно. Надо бы сделать покомпактнее.
Во-вторых, при такой сортировке приходится многократно обращаться к диску, а это довольно дорогая операция (по сравнению с операциями в оперативной памяти). Хуже того, одна и та же операция может выполняться несколько раз.
Метод
Здесь каждый ключ вычисляется ровно один раз, а затем сохраняется в виде пары ключ-данные. Для небольших массивов производительность при таком подходе может даже снизиться, зато код получается более понятным.
Не существует метода
А как обстоит дело с сортировкой по нескольким ключам? Предположим, что имеется массив объектов, который нужно отсортировать по трем атрибутам: имени, возрасту и росту. Из того, что массивы можно сравнивать, следует, что такое решение будет работать:
Конечно, элементы массива могут быть и не такими простыми. Допустимы произвольно сложные выражения.
8.1.6. Выборка из массива по заданному критерию
Иногда нужно найти в массиве один или несколько элементов так, как будто мы опрашиваем таблицу в базе данных. Для этого есть несколько способов; рассмотренные ниже реализованы в подмешанном модуле
Метод
Разумеется,
Метод
Метод
Существует также блочная форма, которая позволяет преобразовать каждый результат перед записью в массив. Получающийся в результате массив содержит значения, возвращенные блоком, а не те, что были в блок первоначально переданы:
Метод
Методы
О любви
Проза:
рассказ
рейтинг книги
Серые сутки
4. Медорфенов
Фантастика:
фэнтези
аниме
рейтинг книги
Наша навсегда
2. Наша
Любовные романы:
современные любовные романы
эро литература
рейтинг книги
Тайный агент императора. Чернышев против Наполеона
Приключения:
исторические приключения
рейтинг книги
Глаз бури
2. Орден Манускрипта
Фантастика:
научная фантастика
рейтинг книги
НОВОСТИ ИЗ КРЕМЛЯ
Научно-образовательная:
история
рейтинг книги
Переписка и деловые бумаги
Документальная литература:
публицистика
рейтинг книги
Тристан и Женевьева (Среди роз)
Любовные романы:
исторические любовные романы
рейтинг книги
Как был покорен Запад
Приключения:
вестерны
рейтинг книги
Кодекс Охотника. Книга ХХ
20. Кодекс Охотника
Фантастика:
попаданцы
альтернативная история
аниме
рейтинг книги
Книга 4. Постижение высших миров
Научно-образовательная:
прочая научная литература
религиоведение
рейтинг книги