web-dev-qa-db-fra.com

Quelle est la différence entre les déclarations "if" avec "then" à la fin?

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
53
Mo.

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
64
Gishu

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.

12
Jörg W Mittag

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.

5
Douglas

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' )
1
zed_0xff

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.

0
jeffdill2