mirror of
https://github.com/jbranchaud/til
synced 2026-01-04 23:58:01 +00:00
Add Turning Any Class Into An Enumerator as a ruby til
This commit is contained in:
@@ -10,7 +10,7 @@ smart people at [Hashrocket](http://hashrocket.com/).
|
|||||||
For a steady stream of TILs from a variety of rocketeers, checkout
|
For a steady stream of TILs from a variety of rocketeers, checkout
|
||||||
[til.hashrocket.com](https://til.hashrocket.com/).
|
[til.hashrocket.com](https://til.hashrocket.com/).
|
||||||
|
|
||||||
_832 TILs and counting..._
|
_833 TILs and counting..._
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -683,6 +683,7 @@ _832 TILs and counting..._
|
|||||||
- [Squeeze Out The Extra Space](ruby/squeeze-out-the-extra-space.md)
|
- [Squeeze Out The Extra Space](ruby/squeeze-out-the-extra-space.md)
|
||||||
- [String Interpolation With Instance Variables](ruby/string-interpolation-with-instance-variables.md)
|
- [String Interpolation With Instance Variables](ruby/string-interpolation-with-instance-variables.md)
|
||||||
- [Summing Collections](ruby/summing-collections.md)
|
- [Summing Collections](ruby/summing-collections.md)
|
||||||
|
- [Turning Any Class Into An Enumerator](ruby/turning-any-class-into-an-enumerator.md)
|
||||||
- [Turning Things Into Hashes](ruby/turning-things-into-hashes.md)
|
- [Turning Things Into Hashes](ruby/turning-things-into-hashes.md)
|
||||||
- [Uncaught Exceptions In Pry](ruby/uncaught-exceptions-in-pry.md)
|
- [Uncaught Exceptions In Pry](ruby/uncaught-exceptions-in-pry.md)
|
||||||
- [`undef_method` And The Inheritance Hierarchy](ruby/undef-method-and-the-inheritance-hierarchy.md)
|
- [`undef_method` And The Inheritance Hierarchy](ruby/undef-method-and-the-inheritance-hierarchy.md)
|
||||||
|
|||||||
60
ruby/turning-any-class-into-an-enumerator.md
Normal file
60
ruby/turning-any-class-into-an-enumerator.md
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
# Turning Any Class Into An Enumerator
|
||||||
|
|
||||||
|
At the core of any enumerator is the ability to respond to an `#each` call.
|
||||||
|
With that in mind, we prepare any class for being turned into an enumerator.
|
||||||
|
|
||||||
|
Consider this class `SquaresCollection` that allows you to turn an array of
|
||||||
|
integers into an array of its squares.
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
class SquaresCollection
|
||||||
|
def initialize(items)
|
||||||
|
@items = items
|
||||||
|
end
|
||||||
|
|
||||||
|
def run
|
||||||
|
@items.map { |item| item * item }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
SquaresCollection.new([1,2,3]).run #=> [1,4,9]
|
||||||
|
```
|
||||||
|
|
||||||
|
We can work with this, but it opts out of Ruby's enumerator offerings.
|
||||||
|
|
||||||
|
We can, instead, provide an `#each` method which allows instances of our
|
||||||
|
`SquaresCollection` class to be turned into enumerators.
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
class SquaresCollection
|
||||||
|
def initialize(items)
|
||||||
|
@items = items
|
||||||
|
end
|
||||||
|
|
||||||
|
def each
|
||||||
|
return enum_for(:each) unless block_given?
|
||||||
|
|
||||||
|
@items.each do |item|
|
||||||
|
yield item * item
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
Here is how we can use it:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
sc = SquaresCollection.new([1,2,3])
|
||||||
|
|
||||||
|
puts sc.to_enum
|
||||||
|
#=> <Enumerator ...>
|
||||||
|
|
||||||
|
puts sc.to_enum.map { |item| "* #{item} *" }
|
||||||
|
#=> ["* 1 *", "* 4 *", "* 9 *"]
|
||||||
|
```
|
||||||
|
|
||||||
|
The [`#to_enum`](https://devdocs.io/ruby~2.5/object#method-i-to_enum) method
|
||||||
|
looks for an `#each` method on the instance's class and uses that to create an
|
||||||
|
enumerator.
|
||||||
|
|
||||||
|
[source](https://blog.arkency.com/2014/01/ruby-to-enum-for-enumerator/)
|
||||||
Reference in New Issue
Block a user