Pattern Matching
Guard Clauses
Pattern branches can add an if guard for extra checks.
pattern guard
A guard runs after a pattern matches and can decide whether that branch should be used.
Guard Clauses
guard_clauses.rb
Replay: real traced execution (multi-file project)
score = 82
record = { name: "Ada", score: score }
case record
in { name: name, score: value } if value >= 80
label = "#{name}:great"
in { name: name, score: value } if value >= 60
label = "#{name}:pass"
else
label = "review"
end
puts "score=#{score}"
puts "label=#{label}"
score = 55
record = { name: "Ada", score: score }
case record
in { name: name, score: value } if value >= 80
label = "#{name}:great"
in { name: name, score: value } if value >= 60
label = "#{name}:pass"
else
label = "review"
end
puts "score=#{score}"
puts "label=#{label}"
score = 70
record = { name: "Ada", score: score }
case record
in { name: name, score: value } if value >= 80
label = "#{name}:great"
in { name: name, score: value } if value >= 60
label = "#{name}:pass"
else
label = "review"
end
puts "score=#{score}"
puts "label=#{label}"
score ← 82
1score→ 82 = 82 #@score=55, 702record = { name: "Ada", score: score }34case record5in { name: name, score: value } if value >= 806 label = "#{name}:great"7in { name: name, score: value } if value >= 608 label = "#{name}:pass"9else10 label = "review"11end1213puts "score=#{score82}"14puts "label=#{labelAda:great}"outputscore=82 label=Ada:great
score ← 55
1score→ 55 = 552record = { name: "Ada", score: score }case record in { name:
4case record{:name=>"Ada", :score=>55}5in { name: name, score: value } if value >= 806 label = "#{name}:great"label ← review
8 label = "#{name}:pass"9else10 label→ review = "review"11endputs "score=#{score}"
13puts "score=#{score55}"14puts "label=#{labelreview}"outputscore=55 label=review
score ← 70
1score→ 70 = 702record = { name: "Ada", score: score }34case record5in { name: name, score: value } if value >= 806 label = "#{name}:great"7in { name: name, score: value } if value >= 608 label = "#{name}:pass"9else10 label = "review"11end1213puts "score=#{score70}"14puts "label=#{labelAda:pass}"outputscore=70 label=Ada:pass