4 comments
Really helpful article, thank you so much for sharing it, Jesus!!!
Thank you for reading
There are lots of interesting methods there. Check out the partition
method
Enumerable is an amazing module, and it’s a big part of what makes Ruby such a great programming language.
Enumerable gives you all sorts of cool methods like map
, select
and inject
. But my new favorite is each_cons
.
This method is really useful, you can use it to find n-grams or to check if a sequence of numbers is contiguous when combined with all?
, another Enumerable
method.
What each_cons
does is give you sub-arrays of size n
, so if you have [1,2,3]
, then each_cons(2)
will give you [[1,2], [2,3]]
.
Let’s see an example:
1 2 3 |
numbers = [3,5,4,2] numbers.sort.each_cons(2).all? { |x,y| x == y - 1 } |
This code starts by sorting the numbers, then calling each_cons(2)
, which returns an Enumerator
object, and then it calls the all?
method to check if all the elements match the condition.
Here is another example, where I use each_cons
to check if a character is surrounded by the same character, like this: xyx
.
1 2 3 |
str = 'abcxyx' str.chars.each_cons(3).any? { |a,b,c| a == c } |
There is more!
If you wanted to know how many times this pattern occurs, instead of getting a true
/ false
result, you can just change any?
to count
.
What I find even more fascinating is the implementation for the each_cons
method.
1 2 3 4 5 6 7 |
array = [] each do |element| array << element array.shift if array.size > n yield array.dup if array.size == n end |
Note: This comes from the Rubinius implementation of
Enumerable
. You can find the original source code here.
The implementation starts with an empty Ruby array, then it iterates through the elements using each
.
Everything is pretty standard until here. But then it adds the element to the array and it trims the array (using Array#shift) if the size is bigger than what we want. The size is the argument to each_cons
.
Then it yields a dup
of the array if the array has the requested size.
I think this is genius, because it keeps a ‘sliding window’ sort of effect into our enumerable object, instead of having to mess around with array indexes.
As you have seen, Enumerable
is a module that is worth mastering, so hop over to the documentation and see what it can do for you!
Don’t forget to share & subscribe to my newsletter in the form below if you enjoyed this article. It would help me a lot!
Really helpful article, thank you so much for sharing it, Jesus!!!
Thank you for reading
There are lots of interesting methods there. Check out the partition
method