Богатый источник методов, предоставляемых Ruby, которые доступны для использования классами.
Предпосылка
Эту тему будет легче понять, если вы обладаете следующими знаниями:
Оглавление
Определение
Модуль Enumerable — это встроенный модуль, предоставляемый Ruby, который имеет набор методов, упакованных вместе, которые включены в другие встроенные классы Ruby, такие как Array, Hash и Range.
Он предназначен для предоставления полезной функциональности классам. Большинство итерационных методов, таких как select
, reject
, delete_if
, find
и т. д., связанных с Array
и Hash
, на самом деле не реализованы в этих классах, но используют ключевое слово include
, чтобы сделать Enumerable
методы доступными для этих классов.
Что-то вроде этого под капотом:
Модуль Enumerable состоит из нескольких методов, таких как:
- Сквозные методы (
map
,delete_if
,select
,и т. д.) - Методы сортировки (
sort
,sort_by
, и т. д.) - Методы поиска (
find
,find_all
,first
,и т. д.)
Использование модуля Enumerable в классе
Если модуль Enumerable
должен использоваться классом, то в этом классе должен быть явно объявлен метод each
. Если метод an Enumerable
передается с block
, этот метод вызовет метод each
и выполнит в нем операции block
с помощью ключевого слова yield
. Вот почему в приведенном выше программном файле enum_01.rb
есть метод each
, определенный в классах Array
и Hash
.
Что произойдет, если мы не используем метод each
?
Следующий вывод для строки № 8:
enum.rb:13:in `map': undefined method `each' for #<Klass:0x000055632209f580 @arg="I am from class "> (NoMethodError)
Когда мы присваиваем block
одному из методов Enumerable
, map
, мы видим, что он ищет метод each
в классе Klass
и, когда не может его найти, возвращает NoMethodError
.
Метод map
вернет массив, поскольку он предназначен для использования в классе Array
, поэтому давайте рассмотрим еще один более практичный пример.
Для обеих программ, enum_03.rb
и enum_04.rb
, он использует метод each
для успешного выполнения операции в block
, переданном методу Enumerable
, map
.
Список всех методов Enumerable, доступных для использования в Официальной документации Ruby.
Почти все методы
Enumerable
вызывают методeach
, а некоторые методы, такие какmax
,min
илиsort
, вызывают оператор<=>
.
Некоторые методы, такие как
count
иtake
, реализованы в классеArray
вместо использования метода из модуляEnumerable
для ускорения операций.
Это все важные вещи, которые нужно знать о модуле Enumerable
.
Моя предыдущая статья:Модули в Ruby
Моя следующая статья:Класс-перечислительв Ruby