Comment l'opérateur conditionnel ( ? :
) est-il utilisé dans Ruby?
Par exemple, est-ce correct?
<% question = question.size > 20 ? question.question.slice(0, 20)+"..." : question.question %>
ruby
ternary-operator
conditional-operator
Mithun Sreedharan
la source
la source
question=question[0,20]
s'il était inférieur à 20, cela ne changera rien.Réponses:
Il s'agit de l' opérateur ternaire , et il fonctionne comme en C (les parenthèses ne sont pas obligatoires). C'est une expression qui fonctionne comme:
Cependant, en Ruby,
if
c'est aussi une expression donc:if a then b else c end
===a ? b : c
, sauf pour les problèmes de priorité. Les deux sont des expressions.Exemples:
Notez que dans le premier cas, des parenthèses sont requises (sinon Ruby est confus car il pense qu'il est
puts if 1
avec des ordures supplémentaires après), mais elles ne sont pas requises dans le dernier cas car ledit problème ne se pose pas.Vous pouvez utiliser le formulaire "long-if" pour la lisibilité sur plusieurs lignes:
la source
nil
etfalse
. Pas très habituel, en effet.la source
puts (true ? "true" : "false")
avec parenthèses. Sinon, l'ordre des opérations n'est pas clair. Lorsque j'ai lu ceci pour la première fois, j'étais confus car je l'ai lu car je(puts true) ? "true" : "false"
m'attendaisputs
à retourner le booléen qui est ensuite devenu la valeur de chaîne.Votre utilisation d'ERB suggère que vous êtes dans Rails. Si tel est le cas, envisagez
truncate
un assistant intégré qui fera le travail pour vous:la source
@pst a donné une excellente réponse, mais je voudrais mentionner que dans Ruby, l'opérateur ternaire est écrit sur une ligne pour être syntaxiquement correct, contrairement à Perl et C où nous pouvons l'écrire sur plusieurs lignes:
Normalement, Ruby génère une erreur si vous essayez de la diviser sur plusieurs lignes, mais vous pouvez utiliser le
\
symbole de continuation de ligne à la fin d'une ligne et Ruby sera satisfait:C'est un exemple simple, mais il peut être très utile lorsqu'il s'agit de lignes plus longues car il garde le code bien présenté.
Il est également possible d'utiliser le ternaire sans les caractères de continuation de ligne en plaçant les opérateurs en dernier sur la ligne, mais je ne l'aime pas ou ne le recommande pas:
Je pense que cela conduit à un code très difficile à lire car le test conditionnel et / ou les résultats s'allongent.
J'ai lu des commentaires disant de ne pas utiliser l'opérateur ternaire parce que c'est déroutant, mais c'est une mauvaise raison de ne pas utiliser quelque chose. Par la même logique, nous ne devrions pas utiliser d'expressions régulières, d'opérateurs de plage ('
..
' et la variation "flip-flop" apparemment inconnue). Ils sont puissants lorsqu'ils sont utilisés correctement, nous devons donc apprendre à les utiliser correctement.Prenons l'exemple du PO:
Envelopper le test conditionnel permet de le rendre plus lisible car il sépare visuellement le test:
Bien sûr, l'exemple entier pourrait être rendu beaucoup plus lisible en utilisant quelques ajouts judicieux d'espaces. Ceci n'est pas testé mais vous aurez l'idée:
Ou, plus écrit de façon plus idiomatique:
Il serait facile d'argumenter que la lisibilité en souffre
question.question
également.la source
true
?true
c'est vraiment une expression qui évalue àtrue
oufalse
. Il est préférable de les délimiter visuellement, car les déclarations ternaires peuvent rapidement se transformer en bruit visuel, ce qui réduit la lisibilité, ce qui affecte la maintenabilité.Un exemple simple où l'opérateur vérifie si l'identifiant du joueur est 1 et définit l'identifiant ennemi en fonction du résultat
Et j'ai trouvé un article sur le sujet qui semble assez utile.
la source
enemy_id = player_id == 1 ? 2 : 1
?Le code
condition ? statement_A : statement_B
est équivalent àla source
Manière la plus simple:
puisque
param_a
n'est pas égal àparam_b
alors laresult
valeur de seraNot same!
la source