Ruby iterators

23
RUBY ITERATORS IN 15 MINUTES OR LESS

description

A 15 minute tutorial on Ruby iterators like each(), reduce() and map()

Transcript of Ruby iterators

Page 1: Ruby iterators

RUBY ITERATORSIN 15 MINUTES OR LESS

Page 2: Ruby iterators

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

THE COMMON ITERATORS

.TIMES()

.EACH()

.COLLECT(), .MAP(), .MAP!()

.REDUCE(), .INJECT()

Page 4: Ruby iterators

WHAT YOU’LL ITERATE OVER

ARRAYS

HASHES

ANYTHING THAT IMPLEMENTS “ENUMERABLE”

Page 5: Ruby iterators

THE SIMPLEST POSSIBLE EXAMPLE

5.times { puts “hello”}

Page 6: Ruby iterators

THE SIMPLEST POSSIBLE EXAMPLE

5.times { puts “hello”}

AN ITERATOR

Page 7: Ruby iterators

THE SIMPLEST POSSIBLE EXAMPLE

5.times { puts “hello”}

A BLOCK

AN ITERATOR

Page 8: Ruby iterators

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

THE SOLUTION (EACH)

some_data.each do |i| puts i[:name] end

Page 10: Ruby iterators

WHY?

ITS EASIER TO READ (ONCE YOU’RE USED TO IT)

YOU’LL MAKE FEWER DUMB MISTAKES

Page 11: Ruby iterators

THE NON-ITERATOR WAY

num = some_data.length - 1for i in 0..num do puts some_data[i][:name]end

Page 12: Ruby iterators

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

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

THE SOLUTION (MAP)

names = some_data.map do |i| i[:name] end

Page 15: Ruby iterators

ALSO PERFECTLY GOOD (COLLECT)

names = some_data.collect do |i| i[:name] end

Page 16: Ruby iterators

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

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

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

...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

SOME REVIEW

WHICH ITERATOR WOULD YOU USE TO....

CALCULATE THE AVERAGE CHARACTER COUNT IN AN ARRAY OF STRINGS

Page 21: Ruby iterators

SOME REVIEW

WHICH ITERATOR WOULD YOU USE TO....

SEND AN EMAIL FOR EACH ADDRESS IN AN ARRAY OF ADDRESSES

Page 22: Ruby iterators

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

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”])