Ruby if Examples: elsif, else and unlessUse the if-statement, elsif and else. See the unless statement.
If, else. A fire emits light. It burns out and the light is lost. The fire has 2 states: on and off. In an expression we could test whether it is burning.
In a selection statement we direct the flow of control. In Ruby we use if. With elsif and else we handle alternative branches. An end is required.
After the if-keyword we place an expression. Ruby then checks whether this statement evaluates to true or false. If it evaluates to true, the inner block is entered.
However: If the expression evaluates to false, the inner block of an if-statement is not reached. The statements are not executed.
Ruby program that uses if-statements
# Some integer variables.
a = 1
b = 2
c = 3
# Test for inequality.
if a != b
puts "1 != 2"
# Add and then test for equality.
if a + b == c
puts "1 + 2 == 3"
1 != 2
1 + 2 == 3
An if-statement can have more parts. It can include an elsif-statement and an else-statement. They are reached only when the initial if-statement evaluates to false.
Here: The statement within the else-block is reached. The if and elseif evaluate to false, so "Z" is printed.
Tip: For performance, putting the condition that matches most often first is fastest. Fewer conditions must be evaluated in total.
Ruby program that uses if, elsif and else
# Two integers.
a = 1
b = 2
# Use if, elsif, else on the integers.
if a > b
# Not reached.
elsif a == b
# Not reached.
# This is printed.
Ruby supports one-line if-statements. The "if" is used to modify the preceding statement. These statements are only run if the if-expression evaluates to true.
Here: The first statement has no effect because the variable is not greater than 5. But the second statement takes effect.
Ruby program that uses one-line if-statements
# Variable equals 5.
i = 5
# Use one-line if-statements.
puts "Greater than 5" if i > 5
puts "Not greater than 5" if i <= 5
Not greater than 5
This is a negated if-statement. It has the same functionality as an if-statement that tests for false, not true. But this syntactic sugar is sometimes useful.
Also: There is an else-statement that can follow the unless statement. The syntax is just like an if-block.
Ruby program that uses unless
i = 4
# Use an unless-else construct.
unless i == 3
Unless, one line.
An unless modifier can also be used on one line. This syntax makes programs readable, almost like English: you take a certain action unless a condition is true.
Here: We display the value of the string with puts, unless the value equals Cat. So the value Dog is displayed.
Ruby program that uses unless, one-line
animal = "Dog"
# Display the animal string unless it equals Cat.
puts animal unless animal == "Cat"
Sometimes we need to chain together expressions in an if-statement. We can use the "and" or "&&" operators. Two syntax forms for "or" are also supported.
Short-circuit: These operators short-circuit. And will stop checking after its first false result, "or" after its first true.
Note: The English operators (and, or) are easier to read. But the symbolic ones are more familiar to developers of C-like languages.
Note 2: The English operators have a lower precedence. For consistency the C-like operators may be a better choice.
Ruby program that uses and, or
animal1 = "cat"
animal2 = "dog"
# And operators.
if animal1 == "cat" and animal2 == "dog"
if animal1 == "cat" && animal2 == "dog"
# Or operators.
if animal1 == "whale" or animal2 == "dog"
if animal1 == "whale" || animal2 == "dog"
And, or precedence.
In the Ruby grammar there is an important difference between "and" and "&&" and the "or" versions. The English words have lower operator precedence.
Note: In my testing, this does not affect many simple expressions. But the change in precedence could affect more complex things.
Program: Consider the 2 if-expressions. The first has "and" which means the part after the "||" is evaluated together.
And: The second if-statement has "&&" which means "top" is evaluated all by itself.
Ruby program that shows precedence change
left = 0
top = 2
# Not true because "and" has lower precedence.
if top == 2 || left == 0 and top == 3
# True because && has higher precedence.
if top == 2 || left == 0 && top == 3
If 1: (top == 2)
(left == 0, top == 3)
If 2: (top == 2, left == 0)
(top == 3)
This statement uses a question mark and a ":" after an expression. If the expression evaluates to true, the first result is chosen.
Otherwise: The second value is used as the result. Here, the value equals 10, so the result is 20. The 0 is returned in all other cases.
Ruby program that uses ternary
value = 10
# Ternary statement.
result = value == 10 ? 20 : 0
In an if-conditional, two equals signs check for equality. Ruby will report a warning if you use just one equals sign. An assignment uses one equals. A conditional, two.
But: The program still compiles. In some languages, this syntax results in a fatal, compile-time error.
Ruby program that causes equals sign warning
value = 10
# We should use two = in a conditional.
if value = 20
C:/programs/file.rb:6: warning: found = in conditional, should be ==
Like a method, an if-statement returns a value. This comes from the last statement evaluated. We can assign a variable to the result of an if-statement.
Result: In this program, the variable cat_sound is assigned to "meow" because the size variable is equal to 0.
Ruby program that assigns to if
# Set size to zero.
size = 0
# Assign cat_sound to result of if-statement.
if size == 0
This keyword can be part of an if-statement. But usually in Ruby programs do not use the "then." This keyword may be preferred if makes the code clearer to read.
Note: In programming, clarity is key. But standard forms—using Ruby that other developers also use—is also important.
Ruby program that uses then keyword
value = 10
size = 10
# The "then" keyword is optional.
if value == size then
# Omit the then.
if value == 10
In an if-statement all values can be evaluated for truth. In this program, we test for truth. We test numbers, empty collections like arrays, and nil.
Numbers: All numbers (including 0) evaluate to true. Other programming languages sometimes treat 0 as false, but not Ruby.
Empty array: An empty Array evaluates also to true. Empty collections are treated the same as ones with elements.
Nil: False and nil evaluate to false—these were the only false values found in this test.
Ruby program that tests for true, false
values = [0, 1, -1, true, false, nil, Array.new()]
# Test all the values for truth.
values.each do |v|
puts String(v) + " = true"
puts String(v) + " = false"
0 = true
1 = true
-1 = true
true = true
false = false
 = true
The if-statement is an imperative branching statement. This means it affects what statements are next executed. Its effect is directly specified by the programmer.
Tip: Thanks to Jason Newell for writing in with an important point about operator precedence.
Some concepts. With an if-statement, we create conditional blocks. The data in our programs influences what operations are taken. An elseif and else provide alternative paths.
© 2007-2020 Sam Allen. Every person is special and unique. Send bug reports to firstname.lastname@example.org.