63 votes

différence entre ruby si les instructions avec "alors" à la fin?

SALUT

quelle est la différence entre ces deux déclarations ruby if lorsque nous mettons 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
 

Merci

78voto

Gishu Points 59012

est ensuite un délimiteur pour aider ruby à identifier la condition et l'expr de la partie vraie.

if condition then partie vraie else partie fausse end

then est facultatif sauf si vous voulez écrire une expression if sur une ligne. Pour un if-else-end couvrant plusieurs lignes, la nouvelle ligne agit comme un délimiteur pour séparer le conditionnel 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
 

13voto

Jörg W Mittag Points 153275

Voici une astuce qui n'est pas directement liée à votre question: en Ruby, il n'y a pas une telle chose comme un if déclaration. En fait, en Ruby, il n'y a pas de déclarations à tous. Tout est une expression. Un if expression renvoie la valeur de la dernière expression évaluée dans la direction qui a été prise.

Donc, il n'y a pas besoin de l'écrire

if condition
  foo(something)
else
  foo(something_else)
end

Ce serait mieux d'être écrite comme

foo(
  if condition
    something
  else
    something_else
  end
)

Ou comme un one-liner

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 aussi un opérateur ternaire (condition ? then_branch : else_branch) mais c'est totalement inutile et devrait être évitée. La seule raison pour laquelle l'opérateur ternaire est nécessaire dans des langages comme C est parce que C if est une déclaration et ne peut donc pas renvoyer une valeur. Vous avez besoin de l'opérateur ternaire, parce que c'est une expression, et la seule façon de rétablir la valeur d'un conditionnel. Mais en Ruby, if est déjà une expression, donc il n'y a vraiment pas besoin d'un opérateur ternaire.

8voto

Douglas Points 10417

Le then n'est requis que si vous voulez écrire l'expression if sur une ligne:

 if val == "hi" then something.meth("hello")
else something.meth("right")
end
 

Que les crochets dans votre exemple ne sont pas significatifs, vous pouvez les ignorer dans les deux cas.

Voir le livre de pioche pour plus de détails.

4voto

zed_0xff Points 12379

Il n'y a aucune différence.

Et, juste pour info, votre code peut être optimisé pour

 something.meth( val == 'hi' ? 'hello' : 'right' )
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X