Your SlideShare is downloading. ×
Ruby Enumerable
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

Ruby Enumerable

3,791
views

Published on

Ruby's Enumerable module

Ruby's Enumerable module


0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,791
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
32
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide
  • its fine to use is_a in irb..in code should use respond_to?
  • Our first example below returns any member which contains an 'a'. The grep method also accepts a block, which is passed each matching value, 'collecting' the results returned and returning those as shown in the second example.
  • Transcript

    • 1. A powerful Ruby Module for Collections
      Enumerable
      by Sarah Allen and Liah Hansen
    • 2. Why Use Enumerables
      Ruby's Enumerable module has methods for all kinds of tasks which operate on a collection.
      If you can imagine a use for the #each method other than simply iterating, there is a good chance a method exists to do what you have in mind.
    • 3. What does Enumerable Mean?
      Collection objects (instances of Array, Hash, etc) typically “mixin” the Enumerable module
      The Enumerable module gives objects of collection classes additional collection-specific behaviors.
      The class requiring the Enumerable module must have an #each method because the additional collection-specific behaviors given by Enumerable are defined in terms of #each
    • 4. Mixing in Enumerable
      class MyCollection
      include Enumerable
      #lots of code
      def each
      #more code
      end
      end
    • 5. View all Classes Mixing in Enumerable
      ObjectSpace.each_object(Class) do |cl|
      puts cl if cl < Enumerable
      end
    • 6. Enumerable::Enumerator
      Struct::Tms
      Dir
      File
      IO
      Range
      Struct
      Hash
      Array
      String
      Struct::Group
      Struct::Passwd
      MyCollection
      StringIO
      Gem::SourceIndex
      YAML::Set
      YAML::Pairs
      YAML::Omap
      YAML::SpecialHas
    • 7. Test an Instance or Class
      >> a = [1,2,3]
      => [1, 2, 3]
      >> a.respond_to? :any?
      => true
      >> a.is_a? Enumerable
      => true
      >> Array < Enumerable
      => true
    • 8. Enumerable Methods
      Collection Behavior
    • 9. each
      Classes that include the Enumerable module must have an #each method.
      The #each method yields items to a supplied code block, one at a time
      Different Classes define #each differently
      Array: #each yields each element
      Hash: each yields #each key/value pair as a two-element array
      >> v_names = %w(car truck bike)
      => ["car", "truck", "bike"]
      >> v_names.each do |vehicle|
      ?> puts vehicle
      >> end
    • 10. map
      The map method modifies each member according to instructions in a block and returns the modified collection of members.
      >> v_names.map { |v| v.upcase}
      => ["CAR", "TRUCK", "BIKE"]
    • 11. grep
      The grep method 'searches' for members using a regular expression.
      >> v_names.grep /a/
      => ["car"]
      >> v_names.grep(/a/) { |v| v.upcase}
      => ["CAR"]
    • 12. find
      >> v_names.find { |v| v.size > 3}
      => "truck"
      >> v_names.find { |v| v.size > 2}
      => "car"
      >> v_names.find do |v|
      v.size > 3 && v.size < 5
      end
      => "bike"
    • 13. all?
      The all? method returns true if all of the members of a collection satisfy the evaluation of the block. Otherwise it returns false.
      >> v_names.all? { |v| v.length > 2}
      => true
      >> v_names.all? { |v| v.length > 10}
      => false
    • 14. any?
      The any? method returns true if any of the members of a collection satisfy the evaluation of the block. Otherwise it returns false.
      >> v_names.any? { |v| v.length == 3}
      => true
      >> v_names.any? { |v| v = "car"}
      => true
    • 15. Working with Complex Data
      irb
      >> load 'vehicles.rb'
      => true
    • 16. inject
      >> $vehicles.inject(0) do |total_wheels, v|
      ?> total_wheels += v[:wheels]
      >> end
      => 10
      >> $vehicles.inject([]) do |classes, v|
      ?> classes += v[:classes]
      >> end.uniq
      => [:ground, :water, :air]
    • 17. Complex Operations
      >> $vehicles.find do |v|
      ?> v[:name] =~ /Plane/
      >> end[:name]
      => "Plane"
      >> $vehicles.find_all do |v|
      ?> v[:name] =~ /Plane/
      >> end.collect { |v| v[:name] }
      => ["Plane", "Sea Plane"]
      >> $vehicles.find_all do |v|
      ?> v[:wheels] > 0
      >> end.collect { |v| v[:name] }
      => ["Car", "Truck", "Bike"]
    • 18. Complex Operations Continued
      >> $vehicles.find_all do |v|
      ?> v[:classes].include? :ground
      >> end.collect { |v| v[:name] }
      => ["Car", "Truck", "Bike", "Sea Plane"]
      >> $vehicles.find_all do |v|
      ?> v[:classes].include? :air
      >> end.collect { |v| v[:name] }
      => ["Plane", "Helicopter", "Sea Plane"]