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

Fun with Enumerator

Fun with Enumerator

Fun with Ruby's Enumerator class

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)