chapter ten

10 Collections central: Enumerable and Enumerator

 

This chapter covers

  • Mixing Enumerable into your classes
  • The use of Enumerable methods in collection objects
  • Strings as quasi-enumerable objects
  • Sorting enumerables with the Comparable module
  • Enumerators

All collection objects aren’t created equal—but an awful lot of them have many characteristics in common. In Ruby, common characteristics among many objects tend to reside in modules. Collections are no exception: collection objects in Ruby typically include the Enumerable module.

Classes that use Enumerable enter into a kind of contract: the class has to define an instance method called each, and in return, Enumerable endows the objects of the class with all sorts of collection-related behaviors. The methods behind these behaviors are defined in terms of each. In some respects, you might say the whole concept of a “collection” in Ruby is pegged to the Enumerable module and the methods it defines on top of each.

10.1 Gaining enumerability through each

10.2 Enumerable Boolean queries

10.3 Enumerable searching and selecting

10.3.1 Getting the first match with find

10.3.2 Getting all matches with find_all (a.k.a. select) and reject

10.3.3 Selecting on threequal matches with grep

10.3.4 Organizing selection results with group_by and partition

10.4 Element-wise enumerable operations

10.4.1 The first method

10.4.2 The take and drop methods

10.4.3 The min and max methods

10.5 Relatives of each

10.5.1 reverse_each

10.5.2 The each_with_index method (and each.with_index)

10.5.3 The each_slice and each_cons methods

10.5.4 The slice_ family of methods

10.5.5 The cycle method

10.5.6 Enumerable reduction with inject

10.6 The map method

10.6.1 The return value of map

10.6.2 In-place mapping with map!

10.7 Strings as quasi-enumerables

10.8 Sorting enumerables

10.8.1 Defining sort-order logic with a block

10.8.2 Concise sorting with sort_by

10.8.3 Sorting enumerables and the Comparable module

10.9 Enumerators and the next dimension of enumerability

10.9.1 Creating enumerators with a code block

10.9.2 Attaching enumerators to other objects