Quelle est la différence entre ces deux déclarations Ruby if
lorsque nous plaçons un then
à la fin de la déclaration if
?
if(val == "hi") then
something.meth("hello")
else
something.meth("right")
end
et
if(val == "hi")
something.meth("hello")
else
something.meth("right")
end
then
est un délimiteur destiné à aider Ruby à identifier la condition et la partie vraie de l'expression.
if
condition then
true-part else
false-part end
then
est facultatif sauf si vous souhaitez écrire une expression if
sur une ligne. Pour une fin if-else couvrant plusieurs lignes, la nouvelle ligne sert de séparateur pour séparer la conditionnelle de la partie vraie.
# 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
Voici un conseil rapide qui n’est pas directement lié à votre question: en Ruby, il n’existe pas d’instruction if
. En fait, dans Ruby, il n’ya aucune déclaration du tout . Tout est une expression. Une expression if
renvoie la valeur de la dernière expression évaluée dans la branche prise.
Donc, il n'y a pas besoin d'écrire
if condition
foo(something)
else
foo(something_else)
end
Cela serait mieux écrit comme
foo(
if condition
something
else
something_else
end
)
Ou comme une ligne
foo(if condition then something else something_else end)
Dans votre exemple:
something.meth(if val == 'hi' then 'hello' else 'right' end)
Remarque: Ruby a également un opérateur ternaire (condition ? then_branch : else_branch
), mais cela est totalement inutile et doit être évité. La seule raison pour laquelle l'opérateur ternaire est nécessaire dans des langages tels que C est que, dans C, if
est une instruction et ne peut donc pas renvoyer de valeur. Vous avez besoin de l'opérateur ternaire, car il s'agit d'une expression et constitue le seul moyen de renvoyer une valeur à partir d'un conditionnel. Mais en Ruby, if
est déjà une expression, il n’est donc pas nécessaire de recourir à un opérateur ternaire.
La then
n'est requise que si vous voulez écrire l'expression if
sur une ligne:
if val == "hi" then something.meth("hello")
else something.meth("right")
end
Les crochets de votre exemple ne sont pas significatifs, vous pouvez les ignorer dans les deux cas.
Voir le Pickaxe Book pour plus de détails.
Il n'y a pas de différence du tout.
Et, juste pour votre information, votre code peut être optimisé pour
something.meth( val == 'hi' ? 'hello' : 'right' )
La seule fois où j'aime utiliser then
sur un if/else
multiligne (oui, je sais que ce n'est pas obligatoire), c'est lorsqu'il existe plusieurs conditions pour la if
, comme ceci:
if some_thing? ||
(some_other_thing? && this_thing_too?) ||
or_even_this_thing_right_here?
then
some_record.do_something_awesome!
end
Je trouve que c'est beaucoup plus lisible que l'une ou l'autre de ces options (complètement valide):
if some_thing? || (some_other_thing? && this_thing_too?) || or_even_this_thing_right_here?
some_record.do_something_awesome!
end
# or
if some_thing? ||
(some_other_thing? && this_thing_too?) ||
or_even_this_thing_right_here?
some_record.do_something_awesome!
end
Parce qu’il fournit une distinction visuelle entre la condition de la variable if
et le bloc à exécuter si la condition est évaluée à true
.