Opération ternaire dans CoffeeScript

318

Je dois définir une valeur aqui dépend d'une condition.

Quel est le moyen le plus court de le faire avec CoffeeScript?

Par exemple, voici comment je le ferais en JavaScript:

a = true  ? 5 : 10  # => a = 5
a = false ? 5 : 10  # => a = 10
evfwcqcg
la source
120
<rant> J'aurais aimé que le script café ait pu juste prendre en charge la syntaxe d'opérateur ternaire, il est plus court et plus facile à lire que if else then </rant>
AJP
2
@AJP Je pense que le ternaire ferait moins de café Ruby-ish, même si Ruby a ça. L'objectif avec le café est toujours la lisibilité et l'arrondi des coins rugueux.
jcollum
37
@jcollum a accepté, mais ce que je trouve le plus troublant, c'est que a = true ? 5 : 10c'est un coffeescript valide, mais ne signifie pas une structure ternaire, au lieu de cela (en javascript) cela signifie: a = true ? true : {5:10}ce qui est connu comme une mauvaise chose® De plus a = false ? {5 : 10}en coffeescript, puis (en javascript) est équivalent à: a = true ? false : {5:10} Pour ce que ça vaut, je ne pense pas que ce soit bon.
AJP
2
Il serait peut-être préférable de préciser if..then..else pour CoffeeScript. Le ? en tant qu'opérateur d'existence a beaucoup de sens: beast = yeti ? "bear"ou if yeti? then alert "It's a yeti!"utilise ?assez bien le.
Paul Oliver
3
Un opérateur ternaire séparé n'est pas vraiment nécessaire dans CoffeeScript comme if/then/elsec'est déjà une expression et fait la même chose. Si vous le manquez vraiment, alors vous êtes plutôt habitué à la syntaxe C ou JavaScript qu'à vraiment en avoir besoin. Si ce n'est pas assez lisible, et cela arrive parfois, mettez simplement l'expression entière entre parenthèses. L'opérateur ?a été épargné pour des vérifications plus utiles qui sont absentes dans JavaScript, comme déjà indiqué par @PaulOliver. L'opérateur existentiel est le meilleur.
skalee

Réponses:

544

Puisque tout est une expression, et résulte donc en une valeur, vous pouvez simplement l'utiliser if/else.

a = if true then 5 else 10
a = if false then 5 else 10

Vous pouvez en savoir plus sur les exemples d'expression ici .

loganfsmyth
la source
8
Je suppose qu'il y a une raison pour que coffeescript ne supporte pas la syntaxe ternaire par défaut javascript?
Augustin Riedinger du
41
La raison en est la préférence du créateur pour quelque chose de "moins cryptique" et moins arbitraire (par exemple, github.com/jashkenas/coffeescript/issues/11#issuecomment-97802 ). [Mes 2 cents - Alors que je me rends compte de l'arbitraire de?:, Je pense que if..then..elsec'est trop verbeux pour remplacer ce qui est censé être une expression concise. Et?: Est après tout une norme très ancrée dans de nombreuses langues, JavaScript parmi elles. Malgré tout cela, il semble être
figé
1
Je suis d'accord avec l'auteur CoffeeScript, j'ai toujours pensé que la syntaxe ternaire était laide et laide AF. Si vous pouvez utiliser if then elsesur la même ligne, faites-le, c'est 7 caractères supplémentaires pour plus de clarté et d'élégance.
Joshua Pinter
Dépend du goût, mais j'ai une forte préférence pour les symboles plutôt que pour les mots clés, comme ->over functionou { }over begin .. end, car j'aime voir un rapport signal / bruit élevé, où les mots sont réservés à une logique spécifique à une fonction et la logique opérationnelle est principalement reléguée aux symboles.
mahemoff
Le lecteur entier pour supprimer ce qui est des structures multilingues très standard ne fait que visser les gens qui font la maintenance, surtout lorsque vous ajoutez d'autres choses `` utiles '' comme pug ... Si vous ne pouvez pas déduire toutes les séquences d'arguments et les parenthèses fantômes ...
Grunion Shaftoe
68
a = if true then 5 else 10
a = if false then 5 else 10 

Voir documentation .

Paul Oliver
la source
21

Dans presque toutes les langues, cela devrait fonctionner à la place:

a = true  && 5 || 10
a = false && 5 || 10
Alexander Senko
la source
38
Cela fonctionne, mais c'est beaucoup moins clair et il n'y a aucune raison de le faire dans une langue qui a une meilleure syntaxe.
Ibrahim
10
Ce n'est pas équivalent dans de nombreuses langues où il y a une conversion implicite falsede valeurs telles que 0, null, undefined,… et ainsi de suite
Lord of the Goo
12
@Ibrahim Cela fonctionne comme un ternaire conditionnel uniquement si la partie après la &&marque est véridique, sinon elle retournerait la dernière partie, ce qui n'est pas ainsi que fonctionnent les ternaires conditionnels.
pepkin88
Justement, la différence! :)
Pierre Voisin
de tous les exemples, c'est celui que je trouverais le plus difficile à dire quelles sont les variables dans un langage donné que je pourrais rencontrer - en particulier une langue comme CoffeeScript (ou Ruby) où les espaces ne sont pas toujours des espaces
Toni Leigh
12

Coffeescript ne prend pas en charge l' opérateur ternaire javascript. Voici la raison de l' auteur de coffeescript :

J'adore les opérateurs ternaires autant que le gars suivant (probablement un peu plus, en fait), mais la syntaxe n'est pas ce qui les rend bons - ils sont géniaux car ils peuvent tenir un if / else sur une seule ligne comme un expression.

Leur syntaxe n'est qu'un autre morceau de magie mystificatrice à mémoriser, sans analogue à quoi que ce soit d'autre dans la langue. Le résultat étant égal, je préférerais de loin avoir if/elsestoujours la même apparence (et toujours être compilé en une expression).

Ainsi, dans CoffeeScript, même les ifs à plusieurs lignes seront compilés en ternaires lorsque cela est approprié, comme le seront les instructions sans clause else:

if sunny   
  go_outside() 
else   
  read_a_book().

if sunny then go_outside() else read_a_book()

Les deux deviennent des ternaires, les deux peuvent être utilisés comme expressions. C'est cohérent et il n'y a pas de nouvelle syntaxe à apprendre. Donc, merci pour la suggestion, mais je ferme ce ticket en tant que "wontfix".

Veuillez vous référer au problème github: https://github.com/jashkenas/coffeescript/issues/11#issuecomment-97802

Max Peng
la source
3

Vous pouvez également l'écrire en deux instructions s'il s'agit principalement d'une utilisation réelle:

a = 5
a = 10 if false

Ou utilisez une instruction switch si vous avez besoin de plus de possibilités:

a = switch x
  when true then 5
  when false then 10

Avec un booléen il peut être surdimensionné mais je le trouve très lisible.

Alinex
la source
1

Version multiligne (par exemple, si vous devez ajouter un commentaire après chaque ligne):

a = if b # a depends on b
then 5   # b is true 
else 10  # b is false
quotesBro
la source
0

CoffeeScriptn'a pas d'opérateur ternaire. C'est ce que disent les docs.

Vous pouvez toujours utiliser une syntaxe comme

a = true then 5 else 10

C'est beaucoup plus clair.

Эд Лесничий
la source