ruby iterators
DESCRIPTION
A 15 minute tutorial on Ruby iterators like each(), reduce() and map()TRANSCRIPT
![Page 1: Ruby iterators](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b745fd4a7959077a8b45c5/html5/thumbnails/1.jpg)
RUBY ITERATORSIN 15 MINUTES OR LESS
![Page 2: Ruby iterators](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b745fd4a7959077a8b45c5/html5/thumbnails/2.jpg)
WHAT YOU’LL NEED FROM PREVIOUS LESSONS
BLOCKS
ARRAYS AND HASHES
RAISE YOUR HAND IF YOU DON’T FEEL COMFORTABLE WITH ALL OF THESE...
![Page 3: Ruby iterators](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b745fd4a7959077a8b45c5/html5/thumbnails/3.jpg)
THE COMMON ITERATORS
.TIMES()
.EACH()
.COLLECT(), .MAP(), .MAP!()
.REDUCE(), .INJECT()
![Page 4: Ruby iterators](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b745fd4a7959077a8b45c5/html5/thumbnails/4.jpg)
WHAT YOU’LL ITERATE OVER
ARRAYS
HASHES
ANYTHING THAT IMPLEMENTS “ENUMERABLE”
![Page 5: Ruby iterators](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b745fd4a7959077a8b45c5/html5/thumbnails/5.jpg)
THE SIMPLEST POSSIBLE EXAMPLE
5.times { puts “hello”}
![Page 6: Ruby iterators](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b745fd4a7959077a8b45c5/html5/thumbnails/6.jpg)
THE SIMPLEST POSSIBLE EXAMPLE
5.times { puts “hello”}
AN ITERATOR
![Page 7: Ruby iterators](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b745fd4a7959077a8b45c5/html5/thumbnails/7.jpg)
THE SIMPLEST POSSIBLE EXAMPLE
5.times { puts “hello”}
A BLOCK
AN ITERATOR
![Page 8: Ruby iterators](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b745fd4a7959077a8b45c5/html5/thumbnails/8.jpg)
A MORE USEFUL EXAMPLE
GIVEN:some_data = [ {name: ”tim c”}, {name: “larry”}, {name: “lindsey”}, {name: “curly”}, {name: “moe”}]
THEN:
PRINT EVERYONE’S NAME ON THE SCREEN
![Page 9: Ruby iterators](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b745fd4a7959077a8b45c5/html5/thumbnails/9.jpg)
THE SOLUTION (EACH)
some_data.each do |i| puts i[:name] end
![Page 10: Ruby iterators](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b745fd4a7959077a8b45c5/html5/thumbnails/10.jpg)
WHY?
ITS EASIER TO READ (ONCE YOU’RE USED TO IT)
YOU’LL MAKE FEWER DUMB MISTAKES
![Page 11: Ruby iterators](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b745fd4a7959077a8b45c5/html5/thumbnails/11.jpg)
THE NON-ITERATOR WAY
num = some_data.length - 1for i in 0..num do puts some_data[i][:name]end
![Page 12: Ruby iterators](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b745fd4a7959077a8b45c5/html5/thumbnails/12.jpg)
YOU DECIDE
num = some_data.length - 1for i in 0..num do puts some_data[i][:name]end
some_data.each do |i| puts i[:name] end
VS.
![Page 13: Ruby iterators](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b745fd4a7959077a8b45c5/html5/thumbnails/13.jpg)
NEXT PROBLEM
GIVEN:some_data = [ {name: ”tim c”}, {name: “larry”}, {name: “lindsey”}, {name: “curly”}, {name: “moe”}]
THEN:
GATHER AN ARRAY OF JUST THE NAMES
![Page 14: Ruby iterators](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b745fd4a7959077a8b45c5/html5/thumbnails/14.jpg)
THE SOLUTION (MAP)
names = some_data.map do |i| i[:name] end
![Page 15: Ruby iterators](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b745fd4a7959077a8b45c5/html5/thumbnails/15.jpg)
ALSO PERFECTLY GOOD (COLLECT)
names = some_data.collect do |i| i[:name] end
![Page 16: Ruby iterators](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b745fd4a7959077a8b45c5/html5/thumbnails/16.jpg)
LAST, CALCULATE SOMETHING
GIVEN:some_data = [ {name: ”tim c”}, {name: “larry”}, {name: “lindsey”}, {name: “curly”}, {name: “moe”}]
THEN:
COUNT HOW MANY NAMES START WITH “L”
![Page 17: Ruby iterators](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b745fd4a7959077a8b45c5/html5/thumbnails/17.jpg)
THE SOLUTION (REDUCE)
count = some_data.reduce(0) do |so_far, i| if i[:name].start_with?(“l”) so_far = so_far + 1 end so_farend
![Page 18: Ruby iterators](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b745fd4a7959077a8b45c5/html5/thumbnails/18.jpg)
PULLING BACK THE CURTAIN
THIS IS LITERALLY ALL THE CODE IN THE RUBY .EACH() ITERATOR
def each for 0..self.length - 1 do yield self[i] endend
![Page 19: Ruby iterators](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b745fd4a7959077a8b45c5/html5/thumbnails/19.jpg)
...THERE ARE MORE. BUT YOU’LL HARDLY EVER USE THEM.
STEP, DOWNTO, UPTO
FIND, FIND_ALL, SELECT, CYCLE
EACH_SLICE
CHUNK, REJECT
EACH_WITH_INDEX
NEARLY EVERYTHING IN ENUMERABLE: HTTP://WWW.RUBY-DOC.ORG/CORE-2.1.1/ENUMERABLE.HTML
![Page 20: Ruby iterators](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b745fd4a7959077a8b45c5/html5/thumbnails/20.jpg)
SOME REVIEW
WHICH ITERATOR WOULD YOU USE TO....
CALCULATE THE AVERAGE CHARACTER COUNT IN AN ARRAY OF STRINGS
![Page 21: Ruby iterators](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b745fd4a7959077a8b45c5/html5/thumbnails/21.jpg)
SOME REVIEW
WHICH ITERATOR WOULD YOU USE TO....
SEND AN EMAIL FOR EACH ADDRESS IN AN ARRAY OF ADDRESSES
![Page 22: Ruby iterators](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b745fd4a7959077a8b45c5/html5/thumbnails/22.jpg)
SOME REVIEW
WHICH ITERATOR WOULD YOU USE TO....
SPLIT AN ARRAY OF FULL NAMES (IE. “TIM CULL”) INTO AN ARRAY OF FIRST NAME/LAST NAME TUPLES (IE. [“TIM”,”CULL”])
![Page 23: Ruby iterators](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b745fd4a7959077a8b45c5/html5/thumbnails/23.jpg)
EXERCISE
NOW, LET’S ACTUALLY DO THAT LAST ONE
SPLIT AN ARRAY OF FULL NAMES (IE. “TIM CULL”) INTO AN ARRAY OF FIRST NAME/LAST NAME TUPLES (IE. [“TIM”,”CULL”])