⚠️ Warning: This is a draft ⚠️
This means it might contain formatting issues, incorrect code, conceptual problems, or other severe issues.
If you want to help to improve and eventually enable this page, please fork RosettaGit's repository and open a merge request on GitHub.
{{collection|Conditional Structures}}
===if-then-else===
if s == 'Hello World'
foo
elsif s == 'Bye World'
bar
else
deus_ex
end
Note that if...end
is an expression, so its return value can be captured in a variable:
s = 'yawn'
result = if s == 'Hello World'
:foo
elsif s == 'Bye World'
:bar
else
:deus_ex
end
# result now holds the symbol :deus_ex
ternary
s == 'Hello World' ? foo : bar
===case-when-else=== A generic case statement
case
when Time.now.wday == 5
puts "TGIF"
when rand(3) == 2
puts "had a 33% chance of being right"
else
puts "nothing special here"
end
or, comparing to a specific object
case cartoon_character
when 'Tom'
chase
when 'Jerry'
flee
end
For the second case, the comparisions are preformed using the ===
"case equality" method like this: 'Tom' === cartoon_character
. The default behaviour of ===
is simple Object#==
but some classes define it differently. For example the Module class (parent class of Class) defines ===
to return true if the class of the target is the specified class or a descendant:
case some_object
when Numeric
puts "I'm a number. My absolute value is #{some_object.abs}"
when Array
puts "I'm an array. My length is #{some_object.length}"
when String
puts "I'm a string. When I'm down I look like this: #{some_object.downcase}"
else
puts "I'm a #{some_object.class}"
end
The class Regexp aliases ===
to =~
so you can write a case block to match against some regexes
case astring
when /\A\Z/ then puts "Empty"
when /\A[[:lower:]]+\Z/ then puts "Lower case"
when /\A[[:upper:]]+\Z/ then puts "Upper case"
else then puts "Mixed case or not purely alphabetic"
end
The class Range aliases ===
to include?
:
case 79
when 1..50 then puts "low"
when 51..75 then puts "medium"
when 76..100 then puts "high"
end