Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Fun with Enumerator

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

Fun with Enumerator

Fun with Ruby's Enumerator class

Avatar for cyclotron3k

cyclotron3k

August 14, 2018
Tweet

More Decks by cyclotron3k

Other Decks in Programming

Transcript

  1. Enumerator != Enumerable [1, 2, 3].each => #<Enumerator: [1, 2,

    3]:each> [1, 2, 3].map => #<Enumerator: [1, 2, 3]:map> [1, 2, 3].select => #<Enumerator: [1, 2, 3]:select>
  2. It gets weird enum = [1, 2, 3].map => #<Enumerator:

    [1, 2, 3]:map> enum.each { |n| "<#{n}>" } => ["<1>", "<2>", "<3>"]
  3. We can make our own Enumerators enum = Enumerator.new do

    |yielder| yielder.yield 1 yielder.yield 2 end enum.to_a => [1, 2]
  4. enum = Enumerator.new do |yielder| puts "Beginning" yielder.yield 1 puts

    "Middle" yielder.yield 2 puts "End" end enum.next Beginning => 1 enum.next Middle => 2 enum.next End StopIteration: iteration reached an end
  5. Infinite sequences! fib = Enumerator.new do |yielder| a = 0

    b = 1 loop do yielder.yield b tmp = a a = b b = tmp + b end end fib.first 10 => [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
  6. Extending Enumerable module Enumerable def my_with_index Enumerator.new do |yielder| i

    = 0 self.each do |e| yielder.yield e, i i += 1 end end end end [:foo, :bar, :baz].my_with_index do |e, i| puts "#{i}: #{e}" end.to_a => [[:foo, 0], [:bar, 1], [:baz, 2]]
  7. Miscellany • Use .lazy when working with infinite series •

    Useful for managing expensive operations • Does not implement a cache (See CachingEnumerator gem)