⚠️ 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