Ruby opérateur ternaire sans autre

Existe-t-il un idiome de ruby ​​pour “If do-this” et “do-this” comme simple commande?

par exemple, je suis en train de faire

object.method ? a.action : nil 

laisser la clause else vide, mais je pense qu’il y a probablement une manière plus idiomatique de le faire qui ne nécessite pas de spécifier un nil à la fin. (et alternativement, je me sens comme prendre plusieurs lignes de code serait un gaspillage dans ce cas.

 a.action if object.method? 

En règle générale: vous n’avez pratiquement jamais besoin de l’opérateur ternaire dans Ruby. La raison pour laquelle vous en avez besoin dans C, c’est que dans C if est une déclaration, donc si vous voulez retourner une valeur, vous devez utiliser l’opérateur ternary, qui est une expression.

En Ruby, tout est une expression, il n’y a pas d’énoncés, ce qui rend l’opérateur ternaire plutôt superflu. Vous pouvez toujours 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 le souligne @ Greg Campbell, équivaut à son tour à la forme du modificateur

 a.action if object.method 

De plus, comme les opérateurs booléens dans Ruby ne renvoient pas seulement true ou false , mais la valeur de la dernière expression évaluée, vous pouvez les utiliser pour le stream de contrôle. Ceci est un idiome importé de Perl et ressemblerait à ceci:

 object.method and a.action 

La réponse de Greg est la meilleure, mais pour le compte rendu, et même plus que dans C, les expressions et les déclarations sont équivalentes en Ruby, alors à part a.action if om? vous pouvez aussi faire des choses comme:

 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; bc) : (d; e; f) (x; y; z) ? (a; bc) : (d; e; f)

Il n’y a pas de situation dans Ruby où seule une seule déclaration ou expression est autorisée …

result = ( && ) ||

value = 1 result = (value == 1 && 'one' ) || 'two' result #=> 'one' value = 1 result = (value == 1 && 'one' ) || 'two' result #=> 'one' Expliquer: valeur == 1 && ‘one’ # => retourne le résultat de la dernière expression, la valeur est égale à 1 et la section sera évaluée, et renvoyer «un».

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

Expliquez: value! = 1 et ‘and’ expression ne seront pas évalués, mais instad sera utilisé ‘ou’ expression et il retournera ‘two’

Une autre façon de procéder sur la même ligne est la suivante:

 if object.method; a.action end 

Ceci est considéré comme un mauvais style par Rubocop, car il utilise un point-virgule pour mettre fin à l’expression, mais je le trouve plus lisible dans certaines conditions que sur l’étiquette if à la fin. Il est plus facile de négliger une instruction if à la fin et je ne veux pas toujours renvoyer quelque chose si la condition n’est pas vraie (comme vous êtes forcé avec un opérateur ternaire).

Vous pouvez aussi être un peu plus bavard et rubocop amical:

 if object.method then a.action end