What is the difference between "if" statements with "then" at the end?
Here's a quick tip that is not directly related to your question: in Ruby, there is no such thing as an if
statement. In fact, in Ruby, there are no statements at all. Everything is an expression. An if
expression returns the value of the last expression that was evaluated in the branch that was taken.
So, there is no need to write
if condition
foo(something)
else
foo(something_else)
end
This would better be written as
foo(
if condition
something
else
something_else
end
)
Or as a one-liner
foo(if condition then something else something_else end)
In your example:
something.meth(if val == 'hi' then 'hello' else 'right' end)
Note: Ruby also has a ternary operator (condition ? then_branch : else_branch
) but that is completely unnecessary and should be avoided. The only reason why the ternary operator is needed in languages like C is because in C if
is a statement and thus cannot return a value. You need the ternary operator, because it is an expression and is the only way to return a value from a conditional. But in Ruby, if
is already an expression, so there is really no need for a ternary operator.
then
is a delimiter to help Ruby identify the condition and the true-part of the expression.
if
condition then
true-part else
false-part end
then
is optional unless you want to write an if
expression in one line. For an if-else-end spanning multiple lines the newline acts as a delimiter to split the conditional from the true-part
# can't use newline as delimiter, need keywords
puts if (val == 1) then '1' else 'Not 1' end
# can use newline as delimiter
puts if (val == 1)
'1'
else
'Not 1'
end
The then
is only required if you want to write the if
expression on one line:
if val == "hi" then something.meth("hello")
else something.meth("right")
end
That brackets in your example are not significant, you can skip them in either case.
See the Pickaxe Book for details.