Assume I have an enumerable object enum
and now I want to get the third item.
I know one of a general approach is convert into an array and then access with index like:
enum.to_a[2]
But this way will create a temporary array and it might be inefficient.
Now I use:
enum.each_with_index {|v, i| break v if i == 2}
But this is quite ugly and redundant.
What's the most efficient way to do this?
You could use take
to peel off the first three elements and then last
to grab the third element from the array that take
gives you:
third = enum.take(3).last
If you don't want to generate any arrays at all then perhaps:
# If enum isn't an Enumerator then 'enum = enum.to_enum' or 'enum = enum.each'
# to make it one.
(3 - 1).times { enum.next }
third = enum.next
Alternative to mu's answer using enumerable-lazy or Ruby 2.1. As lazy as using next
but much more declarative:
enum.lazy.drop(2).first
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With