73 votes

Opérateur ternaire Ruby sans autre

Existe-t-il un idiome ruby pour "If do-this" et "do-this" comme une simple commande?

par exemple, je fais actuellement

 object.method? a.action : nil
 

laisser la clause else vide, mais j’ai le sentiment qu’il existe probablement un moyen plus idiomatique de le faire qui ne nécessite pas de spécifier un zéro à la fin. (et alternativement, je pense que prendre plusieurs lignes de code serait une perte de temps dans ce cas.

136voto

Jörg W Mittag Points 153275

En règle générale: vous avez à peu près jamais besoin de l'opérateur ternaire en Ruby. La raison pour laquelle vous en avez besoin dans C, est parce que dans C if est une instruction, donc si vous voulez retourner une valeur que vous avez à utiliser l'opérateur ternaire, qui est une expression.

En Ruby, tout est une expression, il n'y sont pas consolidés, ce qui rend l'opérateur ternaire assez bien superflu. Vous pouvez toujours les remplacer

cond ? then_branch : else_branch

avec

if cond then then_branch else else_branch end

Donc, dans votre exemple:

object.method ? a.action : nil

est équivalent à

if object.method then a.action end

qui comme @Greg Campbell souligne à son tour, l'équivalent de la fuite if modificateur de forme

a.action if object.method

Aussi, depuis les opérateurs booléens dans Ruby pas juste retour true ou false, mais la valeur de la dernière expression évaluée, vous pouvez les utiliser pour le contrôle de flux. C'est un idiome importés de Perl, et devrait ressembler à ceci:

object.method and a.action

111voto

Greg Campbell Points 10321
a.action if object.method?

16voto

DigitalRoss Points 80400

La réponse de Greg est la meilleure, mais aux fins du compte rendu, et même plus qu'en C, les expressions et les déclarations sont équivalentes en Ruby. Par conséquent, outre a.action if o.m? vous pouvez également procéder de la manière suivante:

 object.method? && a.action
 

Vous pouvez écrire (a; b; c) if d ou même

 (a
 b
 c
) if d
 

ou d'ailleurs: (x; y; z) ? (a; b c) : (d; e; f)

Il n'y a pas de situation en Ruby où une seule déclaration ou expression est autorisée ...

2voto

omakoleg Points 146

result = (<expression> && <true value>) || <false value>

value = 1 result = (value == 1 && 'one' ) || 'two' result #=> 'one' Expliquez: valeur == 1 && 'un' # => renvoie le dernier résultat d'expression, la valeur est égale à 1, la section sera évaluée et renverra 'un'.

value = 0 result = (value == 1 && 'one' ) || 'two' result #=> 'two'

Expliquez: valeur! = 1 et 'et' expression ne sera pas évaluée, mais instad sera utilisé 'ou' expression et il retournera 'deux'

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