Collections
Nested Collections
Arrays and hashes can be nested to model records with related details.
nested collection
A nested collection stores one collection inside another, such as hashes inside an array.
Nested Collections
nested_collections.rb
Replay: real traced execution (multi-file project)
students = [
{ name: "Ada", scores: [8, 9] },
{ name: "Grace", scores: [10, 10] },
{ name: "Linus", scores: [7, 8] }
]
student_name = "Ada"
student = students.find do |entry|
entry[:name] == student_name
end
if student
total = student[:scores].sum
average = total / student[:scores].length
puts "student=#{student_name}"
puts "total=#{total}"
puts "average=#{average}"
else
puts "student=#{student_name}"
puts "status=missing"
end
students = [
{ name: "Ada", scores: [8, 9] },
{ name: "Grace", scores: [10, 10] },
{ name: "Linus", scores: [7, 8] }
]
student_name = "Grace"
student = students.find do |entry|
entry[:name] == student_name
end
if student
total = student[:scores].sum
average = total / student[:scores].length
puts "student=#{student_name}"
puts "total=#{total}"
puts "average=#{average}"
else
puts "student=#{student_name}"
puts "status=missing"
end
students = [
{ name: "Ada", scores: [8, 9] },
{ name: "Grace", scores: [10, 10] },
{ name: "Linus", scores: [7, 8] }
]
student_name = "Matz"
student = students.find do |entry|
entry[:name] == student_name
end
if student
total = student[:scores].sum
average = total / student[:scores].length
puts "student=#{student_name}"
puts "total=#{total}"
puts "average=#{average}"
else
puts "student=#{student_name}"
puts "status=missing"
end
students ← [{:name=>"Ada", :scores=>[8, 9]}, {:name=>"Grace", :scores=>[10, 10]}, {:name=>"Linus", :scores=>[7, 8]}]
1students→ [{:name=>"Ada", :scores=>[8, 9]}, {:name=>"Grace", :scores=>[10, 10]}, {:name=>"Linus", :scores=>[7, 8]}] = [2 { name: "Ada", scores: [8, 9] },3 { name: "Grace", scores: [10, 10] },4 { name: "Linus", scores: [7, 8] }5]6student_name→ Ada = "Ada" #@student_name="Grace", "Matz"78student = students[{:name=>"Ada", :scores=>[8, 9]}, {:name=>"Grace", :scores=>[10, 10]}, {:name=>"Linus", :scores=>[7, 8]}].find do |entry|9 entry[:name] == student_name10endstudent ← {:name=>"Ada", :scores=>[8, 9]}
8student→ {:name=>"Ada", :scores=>[8, 9]} = students[{:name=>"Ada", :scores=>[8, 9]}, {:name=>"Grace", :scores=>[10, 10]}, {:name=>"Linus", :scores=>[7, 8]}].find do |entry{:name=>"Ada", :scores=>[8, 9]}|9 entry[:name] == student_name10endtotal ← 17, average ← 8
12if student{:name=>"Ada", :scores=>[8, 9]}13 total→ 17 = student[:scores].sum1714 average→ 8 = total17 / student[:scores].length215 puts "student=#{student_nameAda}"16 puts "total=#{total17}"17 puts "average=#{average8}"18elseoutputstudent=Ada total=17 average=8
students ← [{:name=>"Ada", :scores=>[8, 9]}, {:name=>"Grace", :scores=>[10, 10]}, {:name=>"Linus", :scores=>[7, 8]}]
1students→ [{:name=>"Ada", :scores=>[8, 9]}, {:name=>"Grace", :scores=>[10, 10]}, {:name=>"Linus", :scores=>[7, 8]}] = [2 { name: "Ada", scores: [8, 9] },3 { name: "Grace", scores: [10, 10] },4 { name: "Linus", scores: [7, 8] }5]6student_name→ Grace = "Grace"78student = students[{:name=>"Ada", :scores=>[8, 9]}, {:name=>"Grace", :scores=>[10, 10]}, {:name=>"Linus", :scores=>[7, 8]}].find do |entry|9 entry[:name] == student_name10enddo |entry|
pass 1 of 28student = students.find do |entry{:name=>"Ada", :scores=>[8, 9]}|9 entry[:name] == student_name10endstudent ← {:name=>"Grace", :scores=>[10, 10]}
pass 2 of 28student→ {:name=>"Grace", :scores=>[10, 10]} = students[{:name=>"Ada", :scores=>[8, 9]}, {:name=>"Grace", :scores=>[10, 10]}, {:name=>"Linus", :scores=>[7, 8]}].find do |entry{:name=>"Grace", :scores=>[10, 10]}|9 entry[:name] == student_name10endtotal ← 20, average ← 10
12if student{:name=>"Grace", :scores=>[10, 10]}13 total→ 20 = student[:scores].sum2014 average→ 10 = total20 / student[:scores].length215 puts "student=#{student_nameGrace}"16 puts "total=#{total20}"17 puts "average=#{average10}"18elseoutputstudent=Grace total=20 average=10
students ← [{:name=>"Ada", :scores=>[8, 9]}, {:name=>"Grace", :scores=>[10, 10]}, {:name=>"Linus", :scores=>[7, 8]}]
1students→ [{:name=>"Ada", :scores=>[8, 9]}, {:name=>"Grace", :scores=>[10, 10]}, {:name=>"Linus", :scores=>[7, 8]}] = [2 { name: "Ada", scores: [8, 9] },3 { name: "Grace", scores: [10, 10] },4 { name: "Linus", scores: [7, 8] }5]6student_name→ Matz = "Matz"78student = students[{:name=>"Ada", :scores=>[8, 9]}, {:name=>"Grace", :scores=>[10, 10]}, {:name=>"Linus", :scores=>[7, 8]}].find do |entry|9 entry[:name] == student_name10enddo |entry|
pass 1 of 38student = students.find do |entry{:name=>"Ada", :scores=>[8, 9]}|9 entry[:name] == student_name10endAll 3 passes — pass 1 is the card above pass entrystudentsstudent_namestudent1 {:name=>"Ada", :scores=>[8, 9]} — — — 2 {:name=>"Grace", :scores=>[10, 10]} — — — 3 {:name=>"Linus", :scores=>[7, 8]} [{:name=>"Ada", :scores=>[8, 9]}, {:name=>"Grace", :scores=>[10, 10]}, {:name=>"Linus", :scores=>[7, 8]}] Matz (empty) else
17 puts "average=#{average}"18else19 puts "student=#{student_nameMatz}"20 puts "status=missing"21endoutputstudent=Matz status=missing