SlideShare a Scribd company logo
THE ENUMERABLE MODULE
                         or How I Fell In Love with Ruby!


                                  Haris Amin
                          Cascadia Ruby Conf 2011
                                  07/29/2011



Monday, August 1, 2011
WHO IS THIS GUY?


    • Haris Amin

    • Software/Web           Developer

    • Live         in New York City




Monday, August 1, 2011
THESE GUYS MAKE SURE I’M
         NOT LIVING IN THE STREETS




Monday, August 1, 2011
WHAT WE DO @
           ?
                               Shoulder Pressing Colleagues




          Healthy Programmer
              Vertebrates


Monday, August 1, 2011
LOOK MA I HAS DEGREE!


    • Studies            Physics/Math in Undergrad

    •E       = mc^2 , doesn’t pay for food

    • Programming, for            me in college was just a means to compute
        something



Monday, August 1, 2011
LAST TALK I GAVE AT A
                            CONFERENCE?

    • Simulation             of Viscoelastic Fluids

    • What               did I do?

    • Employed   a weighted-norm least-squares finite element
        method to approximate the solution to Oldroyd-B equations

    • So...yeah... for          me programming was just a way to compute
        stuff :)


Monday, August 1, 2011
THOUGHT TO MYSELF...

                         Arrays & Hashes

                          ARE FUN!!!!



Monday, August 1, 2011
WHAT IS THE ENUMERABLE
                   MODULE?

    •A        module, you can MIX IT IN!

    •A        bunch of methods that work with collections

    • Empowers    the most notably the Array and Hash classes
        (among others i.e. Set, Range, File, etc.)




Monday, August 1, 2011
HOW TO ‘MIX-IN’ THE
                           ENUMERABLE?


    •A    class ‘including’ or ‘mixing-in’ Enumerable must define the
        ‘#each’ method

    • Yielded    items from the #each method empower the
        collection awareness for the class




Monday, August 1, 2011
class PlanetExpress
                           include Enumerable

                           def each
                             yield “Bender”
                             yield “Frye”
                             yield “Leela”
                             yield “Zoidberg”
                           end
                         end

                         PlanetExpress.new.collect do |member|
                           “#{member} works at Planet Express”
                         end



          • The    #collect method executes the provided block
              to all of the values yielded by #each

Monday, August 1, 2011
BUT WHY IS ENUMERABLE
             SO...
                           ...
                           ...
                           ...
                         SEXY!?

Monday, August 1, 2011
LOOK AT ALL THESE
                            METHODS!
  • all?, any?, collect, detect, each_cons, each_slice,
      each_with_index, entries, enum_cons,
      enum_slice, enum_with_index, find, find_all,
      grep, include?, inject, map, max, member?, min,
      partition, reject, select, sort, sort_by, to_a,
      to_set, zip



Monday, August 1, 2011
PROGRAMMER
                           HAPPINESS



“Programmers often feel joy when they can concentrate on
 the creative side of programming, so Ruby is designed to
                 make programmers happy.”
                - Yukihiro Matsumoto (Matz)

Monday, August 1, 2011
WATCH OUT FOR DR.
                          ZOIDBERG’S TIPS




Monday, August 1, 2011
LET’S TAKE A LOOK AT SOME
        ENUMERABLE METHODS...



Monday, August 1, 2011
each

             names = %w{ Frye Leela Zoidberg }

             names.each do |name|
               “#{name} works at Planet Express”
             end



            • The   #each method yields items to a supplied block of
                code one at a time

            • Classes    implement #each differently




Monday, August 1, 2011
find


             names = %w{ Frye Leela Zoidberg }

             names.find { |name| name.length > 4}




            • Elegantly  simple, find one item that matches the
                condition supplied by the block

            • Consider  how a library like ActiveRecord would
                reimplemnt find from Enumerable?


Monday, August 1, 2011
group_by

             names = %w{ Frye Bender Leela Zoidberg }

             names.group_by { |name| name.length}
             # => {4=>["Frye"], 6=>["Bender"], 5=>["Leela"], 8=>["Zoidberg"]}




           • It  takes a block, and returns a hash, with the returned
               value from the block set as the key

           • Consider  how one could use this as word count for a
               document/text



Monday, August 1, 2011
grep

             names = %w{ Frye Bender Leela Zoidberg }

             names.grep(/oidber/)
             # => ["Zoidberg"]




           • Searches      for members of the collection according to a
               pattern.... pattern matching

           • It     uses the === operator for pattern matching




Monday, August 1, 2011
GREP-ALICOUS!
             stuff = [ “Zoidberg”, Pizza.new, :homeless, “Dr."]
             stuff.grep(String)
             # => [ “Zoidberg”, “Dr.”]

              • Using     the === allows us to do some fancy matching

              • We       can grep for types or objects

              • Equivalent      to stuff.select { |element| String === element}



                              Dr. Zoidberg’s Tip (The doctor is in!)
Monday, August 1, 2011
map / collection

             names = %w{ Frye Bender Leela Zoidberg }

             names.map { |name| name.downcase }
             # => [“frye”, “bender”, “leela”, “zoidberg” ]


           • Think   of it as a transformation method, that applies the
               block as a transformation

           • Always      returns a new Array with the transformation
               applied

           • Different    then #each, return value matters with #map


Monday, August 1, 2011
THE DELICIOUS ENUMERATOR
                         ... enum ... enum ... enum




Monday, August 1, 2011
ENUMERATOR
    • We   can create an Enumerator without mixing-in the
        Enumerable module and still have the power of Enumerable
        methods

    •3       ways to create Enumerator without mixing-in Enumerable

                1. Create Enumerator explicitly with a code block
                2. Attach an Enumerator to another object
               3. Create Enumerator implicitly with blockless iterators

Monday, August 1, 2011
Create Enumerator explicitly with a code block

                            e =   Enumerator.new do |y|
                              y   << “Frye”
                              y   << “Bender”
                              y   << “Leela”
                              y   << “Zoidberg”
                            end


        •y      is the yielder, an instance of Enumerator::Yielder

        • You    don’t yield from the block, you only append to the
            yielder

Monday, August 1, 2011
Attach an Enumerator to another object


                         names = %w { Frye Bender Leela Zoidberg }
                         e = names.enum_for(:select)



       • knows/learns         how to implement #each from another object

       • we’re  binding the Enumerator to the #select method of the
           names array




Monday, August 1, 2011
Create Enumerator implicitly with blockless iterators
           names = %w { Frye Leela Bender }

           names.enum_for(:select)
           # => #<Enumerator: ["Frye", "Leela", "Bender"]:map>

           names.map
           # => #<Enumerator: ["Frye", "Leela", "Bender"]:map>

       • most  iterators when called without a block return an
           Enumerator

       • our  blockless iterator returned the same Enumerator as the
           enum_for approach
Monday, August 1, 2011
BUT WHY DO WE CARE?

                         ...USES?




Monday, August 1, 2011
Add Enumerability to an existing object
                         module PlanetExpress
                            class Ship
                              PARTS= %w{ sprockets black-matter }
                              def survey_parts
                                PARTS.each {|part| yield part }
                              end
                            end
                          end

                         ship = PlanetExpress::Ship.new
                         enum = ship.enum_for(:survey_parts)


        • Now            we can use Enumerable methods on our ship object
Monday, August 1, 2011
Fine Grained Iteration

                         scenes = %w{ credits opening climax end }
                         e = scenes
                         puts e.next
                         puts e.next
                         e.rewind puts e.next

          • An           Enumerator is an object, it can maintain state

          • Think          film reels, state machines, etc...




Monday, August 1, 2011
CHAINING ENUMERATORS...
                         ...HMMM



Monday, August 1, 2011
CHAINING ENUMERATORS


    • Normally           chaining enumerators isn’t very useful

    • names.map.select           might as well be names.select

    • Most    enumerators are just passing the array of values down
        the chain



Monday, August 1, 2011
LAZY SLICE
             names = %w { Frye Bender Leela Zoidberg }
             names.each_slice(2).map do |first, second|
               “#{first} gets a slice & #{second} gets a slice”
             end

              • Instead   of creating a 2-element slices for the whole
                  array in memory, the enumerator can create slices in a
                  “lazy” manner and only create them as they are
                  needed



                          Dr. Zoidberg’s Tip (can i have a slice)
Monday, August 1, 2011
MAP WITH INDEX...WTF?
             names = %w { Leela Bender Frye Zoidberg }
             names.map.with_index do |name, i|
               “#{name} has a rank #{i}”
             end

              • There       is no #map_with_index defined in Enumerable

              • Ah       but we can chain... chain... chain!




                              Dr. Zoidberg’s Tip (what map? i don’t even know where we are!)
Monday, August 1, 2011
THE SET CLASS




Monday, August 1, 2011
WHAT IS SET?

    • The          Set class is a Standard Lib class in Ruby

    • You          use it by requiring it explicitly ( require ‘set’ )

    • It     stores a collection of unordered, unique values

    • It     mixes-in the Enumerable module




Monday, August 1, 2011
SET IS ENUMERABLE
                         class Set
                           include Enumerable

                           #...

                           def each
                             block_given? or return enum_for(__method__)
                             @hash.each_key { |o| yield(o) }
                             self
                           end
                         end

        • Calls   a block for each member of the set passing the member
            as a parameter

        • Returns         an enumerator if no block is given
Monday, August 1, 2011
SET IS ENUMERABLE
                         class Set
                           include Enumerable

                           #...

                           def initialize
                             @hash ||= Hash.new
                             enum.nil? and return
                             if block
                               do_with_enum(enum) { |o| add(block[o]) }
                             else
                               merge(enum)
                             end
                           end
                         end

                • Actually    uses Hash for implementing unique values

Monday, August 1, 2011
SET IS ENUMERABLE
                         class Set
                           include Enumerable

                           #...

                           def include?
                             @hash.include?(o)
                           end
                           alias member? include?
                         end




                     • Defines     its own implementation of Enumerable methods


Monday, August 1, 2011
ARE YOU IN LOVE YET?




Monday, August 1, 2011
THEN READ THIS




      • Thistalk was inspired by the AWESOME discussion of
        Enumerable by David A. Black
      • READ IT! SPREAD THE WORD!!!!
Monday, August 1, 2011
THANK YOU!

                            hamin


                            harisamin


                            harisamin.tumblr.com



Monday, August 1, 2011

More Related Content

PDF
Ruby motion and-ios-accessibility
PDF
Developing a Language
PDF
Free Ebooks Download ! Edhole
KEY
Say Hello To Ecmascript 5
PPT
Turing Machine
PPSX
FINITE STATE MACHINE AND CHOMSKY HIERARCHY
PPT
Turing machines
PDF
Lecture: Context-Free Grammars
Ruby motion and-ios-accessibility
Developing a Language
Free Ebooks Download ! Edhole
Say Hello To Ecmascript 5
Turing Machine
FINITE STATE MACHINE AND CHOMSKY HIERARCHY
Turing machines
Lecture: Context-Free Grammars

Viewers also liked (7)

PPT
Network Layer,Computer Networks
PPTX
Finite state machine
PPT
Finite State Machine | Computer Science
PPT
Cldch8
PPTX
Turing machine by_deep
PPT
BASIC CONCEPTS OF COMPUTER NETWORKS
PDF
LinkedIn SlideShare: Knowledge, Well-Presented
Network Layer,Computer Networks
Finite state machine
Finite State Machine | Computer Science
Cldch8
Turing machine by_deep
BASIC CONCEPTS OF COMPUTER NETWORKS
LinkedIn SlideShare: Knowledge, Well-Presented
Ad

Similar to The Enumerable Module or How I Fell in Love with Ruby (20)

KEY
Enumerables
PDF
Ruby — An introduction
PPTX
Ruby data types and objects
KEY
Test First Teaching
PDF
Ruby Language - A quick tour
PDF
Enumerables
KEY
An introduction to Ruby
PDF
Let’s Talk About Ruby
PDF
Ruby & Machine Vision - Talk at Sheffield Hallam University Feb 2009
PDF
A Gentle Introduction to Functional Paradigms in Ruby
PPT
Inside Enumerable
PDF
Clojure for Rubyists
PDF
Let's code
PDF
Let's Code
PDF
Be aware of side effects
PDF
A linguagem de programação Ruby - Robson "Duda" Sejan Soares Dornelles
PDF
Ruby Programming Language
PDF
Ruby 程式語言入門導覽
PDF
Thinking Functionally In Ruby
Enumerables
Ruby — An introduction
Ruby data types and objects
Test First Teaching
Ruby Language - A quick tour
Enumerables
An introduction to Ruby
Let’s Talk About Ruby
Ruby & Machine Vision - Talk at Sheffield Hallam University Feb 2009
A Gentle Introduction to Functional Paradigms in Ruby
Inside Enumerable
Clojure for Rubyists
Let's code
Let's Code
Be aware of side effects
A linguagem de programação Ruby - Robson "Duda" Sejan Soares Dornelles
Ruby Programming Language
Ruby 程式語言入門導覽
Thinking Functionally In Ruby
Ad

Recently uploaded (20)

PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PPTX
A Presentation on Artificial Intelligence
PDF
Machine learning based COVID-19 study performance prediction
PDF
A comparative analysis of optical character recognition models for extracting...
PPTX
Group 1 Presentation -Planning and Decision Making .pptx
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PDF
Univ-Connecticut-ChatGPT-Presentaion.pdf
PDF
Assigned Numbers - 2025 - Bluetooth® Document
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PPTX
Spectroscopy.pptx food analysis technology
PDF
Heart disease approach using modified random forest and particle swarm optimi...
PDF
Encapsulation theory and applications.pdf
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PDF
Empathic Computing: Creating Shared Understanding
PDF
Getting Started with Data Integration: FME Form 101
PDF
Network Security Unit 5.pdf for BCA BBA.
PPT
Teaching material agriculture food technology
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
Digital-Transformation-Roadmap-for-Companies.pptx
A Presentation on Artificial Intelligence
Machine learning based COVID-19 study performance prediction
A comparative analysis of optical character recognition models for extracting...
Group 1 Presentation -Planning and Decision Making .pptx
Reach Out and Touch Someone: Haptics and Empathic Computing
Univ-Connecticut-ChatGPT-Presentaion.pdf
Assigned Numbers - 2025 - Bluetooth® Document
Building Integrated photovoltaic BIPV_UPV.pdf
Spectroscopy.pptx food analysis technology
Heart disease approach using modified random forest and particle swarm optimi...
Encapsulation theory and applications.pdf
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Advanced methodologies resolving dimensionality complications for autism neur...
Empathic Computing: Creating Shared Understanding
Getting Started with Data Integration: FME Form 101
Network Security Unit 5.pdf for BCA BBA.
Teaching material agriculture food technology
Mobile App Security Testing_ A Comprehensive Guide.pdf
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...

The Enumerable Module or How I Fell in Love with Ruby

  • 1. THE ENUMERABLE MODULE or How I Fell In Love with Ruby! Haris Amin Cascadia Ruby Conf 2011 07/29/2011 Monday, August 1, 2011
  • 2. WHO IS THIS GUY? • Haris Amin • Software/Web Developer • Live in New York City Monday, August 1, 2011
  • 3. THESE GUYS MAKE SURE I’M NOT LIVING IN THE STREETS Monday, August 1, 2011
  • 4. WHAT WE DO @ ? Shoulder Pressing Colleagues Healthy Programmer Vertebrates Monday, August 1, 2011
  • 5. LOOK MA I HAS DEGREE! • Studies Physics/Math in Undergrad •E = mc^2 , doesn’t pay for food • Programming, for me in college was just a means to compute something Monday, August 1, 2011
  • 6. LAST TALK I GAVE AT A CONFERENCE? • Simulation of Viscoelastic Fluids • What did I do? • Employed a weighted-norm least-squares finite element method to approximate the solution to Oldroyd-B equations • So...yeah... for me programming was just a way to compute stuff :) Monday, August 1, 2011
  • 7. THOUGHT TO MYSELF... Arrays & Hashes ARE FUN!!!! Monday, August 1, 2011
  • 8. WHAT IS THE ENUMERABLE MODULE? •A module, you can MIX IT IN! •A bunch of methods that work with collections • Empowers the most notably the Array and Hash classes (among others i.e. Set, Range, File, etc.) Monday, August 1, 2011
  • 9. HOW TO ‘MIX-IN’ THE ENUMERABLE? •A class ‘including’ or ‘mixing-in’ Enumerable must define the ‘#each’ method • Yielded items from the #each method empower the collection awareness for the class Monday, August 1, 2011
  • 10. class PlanetExpress include Enumerable def each yield “Bender” yield “Frye” yield “Leela” yield “Zoidberg” end end PlanetExpress.new.collect do |member| “#{member} works at Planet Express” end • The #collect method executes the provided block to all of the values yielded by #each Monday, August 1, 2011
  • 11. BUT WHY IS ENUMERABLE SO... ... ... ... SEXY!? Monday, August 1, 2011
  • 12. LOOK AT ALL THESE METHODS! • all?, any?, collect, detect, each_cons, each_slice, each_with_index, entries, enum_cons, enum_slice, enum_with_index, find, find_all, grep, include?, inject, map, max, member?, min, partition, reject, select, sort, sort_by, to_a, to_set, zip Monday, August 1, 2011
  • 13. PROGRAMMER HAPPINESS “Programmers often feel joy when they can concentrate on the creative side of programming, so Ruby is designed to make programmers happy.” - Yukihiro Matsumoto (Matz) Monday, August 1, 2011
  • 14. WATCH OUT FOR DR. ZOIDBERG’S TIPS Monday, August 1, 2011
  • 15. LET’S TAKE A LOOK AT SOME ENUMERABLE METHODS... Monday, August 1, 2011
  • 16. each names = %w{ Frye Leela Zoidberg } names.each do |name| “#{name} works at Planet Express” end • The #each method yields items to a supplied block of code one at a time • Classes implement #each differently Monday, August 1, 2011
  • 17. find names = %w{ Frye Leela Zoidberg } names.find { |name| name.length > 4} • Elegantly simple, find one item that matches the condition supplied by the block • Consider how a library like ActiveRecord would reimplemnt find from Enumerable? Monday, August 1, 2011
  • 18. group_by names = %w{ Frye Bender Leela Zoidberg } names.group_by { |name| name.length} # => {4=>["Frye"], 6=>["Bender"], 5=>["Leela"], 8=>["Zoidberg"]} • It takes a block, and returns a hash, with the returned value from the block set as the key • Consider how one could use this as word count for a document/text Monday, August 1, 2011
  • 19. grep names = %w{ Frye Bender Leela Zoidberg } names.grep(/oidber/) # => ["Zoidberg"] • Searches for members of the collection according to a pattern.... pattern matching • It uses the === operator for pattern matching Monday, August 1, 2011
  • 20. GREP-ALICOUS! stuff = [ “Zoidberg”, Pizza.new, :homeless, “Dr."] stuff.grep(String) # => [ “Zoidberg”, “Dr.”] • Using the === allows us to do some fancy matching • We can grep for types or objects • Equivalent to stuff.select { |element| String === element} Dr. Zoidberg’s Tip (The doctor is in!) Monday, August 1, 2011
  • 21. map / collection names = %w{ Frye Bender Leela Zoidberg } names.map { |name| name.downcase } # => [“frye”, “bender”, “leela”, “zoidberg” ] • Think of it as a transformation method, that applies the block as a transformation • Always returns a new Array with the transformation applied • Different then #each, return value matters with #map Monday, August 1, 2011
  • 22. THE DELICIOUS ENUMERATOR ... enum ... enum ... enum Monday, August 1, 2011
  • 23. ENUMERATOR • We can create an Enumerator without mixing-in the Enumerable module and still have the power of Enumerable methods •3 ways to create Enumerator without mixing-in Enumerable 1. Create Enumerator explicitly with a code block 2. Attach an Enumerator to another object 3. Create Enumerator implicitly with blockless iterators Monday, August 1, 2011
  • 24. Create Enumerator explicitly with a code block e = Enumerator.new do |y| y << “Frye” y << “Bender” y << “Leela” y << “Zoidberg” end •y is the yielder, an instance of Enumerator::Yielder • You don’t yield from the block, you only append to the yielder Monday, August 1, 2011
  • 25. Attach an Enumerator to another object names = %w { Frye Bender Leela Zoidberg } e = names.enum_for(:select) • knows/learns how to implement #each from another object • we’re binding the Enumerator to the #select method of the names array Monday, August 1, 2011
  • 26. Create Enumerator implicitly with blockless iterators names = %w { Frye Leela Bender } names.enum_for(:select) # => #<Enumerator: ["Frye", "Leela", "Bender"]:map> names.map # => #<Enumerator: ["Frye", "Leela", "Bender"]:map> • most iterators when called without a block return an Enumerator • our blockless iterator returned the same Enumerator as the enum_for approach Monday, August 1, 2011
  • 27. BUT WHY DO WE CARE? ...USES? Monday, August 1, 2011
  • 28. Add Enumerability to an existing object module PlanetExpress class Ship PARTS= %w{ sprockets black-matter } def survey_parts PARTS.each {|part| yield part } end end end ship = PlanetExpress::Ship.new enum = ship.enum_for(:survey_parts) • Now we can use Enumerable methods on our ship object Monday, August 1, 2011
  • 29. Fine Grained Iteration scenes = %w{ credits opening climax end } e = scenes puts e.next puts e.next e.rewind puts e.next • An Enumerator is an object, it can maintain state • Think film reels, state machines, etc... Monday, August 1, 2011
  • 30. CHAINING ENUMERATORS... ...HMMM Monday, August 1, 2011
  • 31. CHAINING ENUMERATORS • Normally chaining enumerators isn’t very useful • names.map.select might as well be names.select • Most enumerators are just passing the array of values down the chain Monday, August 1, 2011
  • 32. LAZY SLICE names = %w { Frye Bender Leela Zoidberg } names.each_slice(2).map do |first, second| “#{first} gets a slice & #{second} gets a slice” end • Instead of creating a 2-element slices for the whole array in memory, the enumerator can create slices in a “lazy” manner and only create them as they are needed Dr. Zoidberg’s Tip (can i have a slice) Monday, August 1, 2011
  • 33. MAP WITH INDEX...WTF? names = %w { Leela Bender Frye Zoidberg } names.map.with_index do |name, i| “#{name} has a rank #{i}” end • There is no #map_with_index defined in Enumerable • Ah but we can chain... chain... chain! Dr. Zoidberg’s Tip (what map? i don’t even know where we are!) Monday, August 1, 2011
  • 34. THE SET CLASS Monday, August 1, 2011
  • 35. WHAT IS SET? • The Set class is a Standard Lib class in Ruby • You use it by requiring it explicitly ( require ‘set’ ) • It stores a collection of unordered, unique values • It mixes-in the Enumerable module Monday, August 1, 2011
  • 36. SET IS ENUMERABLE class Set include Enumerable #... def each block_given? or return enum_for(__method__) @hash.each_key { |o| yield(o) } self end end • Calls a block for each member of the set passing the member as a parameter • Returns an enumerator if no block is given Monday, August 1, 2011
  • 37. SET IS ENUMERABLE class Set include Enumerable #... def initialize @hash ||= Hash.new enum.nil? and return if block do_with_enum(enum) { |o| add(block[o]) } else merge(enum) end end end • Actually uses Hash for implementing unique values Monday, August 1, 2011
  • 38. SET IS ENUMERABLE class Set include Enumerable #... def include? @hash.include?(o) end alias member? include? end • Defines its own implementation of Enumerable methods Monday, August 1, 2011
  • 39. ARE YOU IN LOVE YET? Monday, August 1, 2011
  • 40. THEN READ THIS • Thistalk was inspired by the AWESOME discussion of Enumerable by David A. Black • READ IT! SPREAD THE WORD!!!! Monday, August 1, 2011
  • 41. THANK YOU! hamin harisamin harisamin.tumblr.com Monday, August 1, 2011