Operazione ternaria in CoffeeScript


318

Devo impostare il valore su ache dipende da una condizione.

Qual è il modo più breve per farlo con CoffeeScript?

Ad esempio, è così che lo farei in JavaScript:

a = true  ? 5 : 10  # => a = 5
a = false ? 5 : 10  # => a = 10

120
<rant> Vorrei che la sceneggiatura del caffè avesse appena supportato la sintassi dell'operatore ternario, è più breve e più facile da leggere rispetto a if else then </rant>
AJP,

2
@AJP Penso che il ternario renderebbe il caffè meno rubino, anche se Ruby ce l'ha. L'obiettivo con il caffè è sempre la leggibilità e l'arrotondamento di angoli difficili.
jcollum,

37
@jcollum ha concordato, ma quello che trovo davvero più inquietante è che a = true ? 5 : 10sia valido il coffeescript, ma non significa una struttura ternaria, invece (in javascript) significa: a = true ? true : {5:10}che è noto come una cosa negativa® Inoltre a = false ? {5 : 10}in coffeescript quindi (in javascript) è equivalente a: a = true ? false : {5:10} per quello che vale, non penso che sia buono.
AJP,

2
Potrebbe essere meglio precisare se ... poi ... per CoffeeScript. Il ? come operatore di esistenza ha molto senso: beast = yeti ? "bear"o if yeti? then alert "It's a yeti!"usa ?abbastanza bene.
Paul Oliver,

3
L'operatore ternario separato non è realmente necessario in CoffeeScript poiché if/then/elseè già un'espressione e fa la stessa cosa. Se ti manca davvero, allora sei piuttosto abituato alla sintassi C o JavaScript piuttosto che ne hai davvero bisogno. Se non è abbastanza leggibile, e talvolta succede, basta racchiudere l'intera espressione tra parentesi. L'operatore ?è stato risparmiato per controlli più utili che sono assenti in JavaScript, come già affermato da @PaulOliver. L'operatore esistenziale è il migliore.
Skalee,

Risposte:


544

Dal momento che tutto è un'espressione, e quindi risulta in un valore, puoi semplicemente usare if/else.

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

Puoi vedere di più sugli esempi di espressioni qui .


8
Suppongo che ci sia una ragione per cui coffeescript non supporta la sintassi ternaria predefinita javascript?
Augustin Riedinger,

41
Il motivo è la preferenza del creatore per qualcosa di "meno criptico" e meno arbitrario (ad esempio, github.com/jashkenas/coffeescript/issues/11#issuecomment-97802 ). [I miei 2 centesimi - Mentre mi rendo conto dell'arbitrarietà di?:, Penso che if..then..elsesia una sostituzione troppo dettagliata per quella che dovrebbe essere un'espressione concisa. E?: Dopo tutto è uno standard molto radicato in molte lingue, JavaScript tra loro. Nonostante tutto, sembra essere incastonato in questa fase.]
mahemoff

1
Concordo con l'autore di CoffeeScript, ho sempre pensato che la sintassi ternaria fosse una brutta e non intuitiva AF. Se puoi usarlo if then elsesulla stessa linea, fallo, sono 7 caratteri aggiuntivi per molta più chiarezza ed eleganza.
Joshua Pinter

Dipende dal gusto, ma ho una forte preferenza per i simboli rispetto alle parole chiave, come ->sopra functiono { }sopra begin .. end, perché mi piace vedere un rapporto segnale / rumore elevato, in cui le parole sono riservate alla logica specifica della funzione e la logica operativa è per lo più relegata ai simboli.
mahemoff,

L'intero drive per rimuovere quelle che sono strutture cross-language molto standard in realtà avvita solo le persone che stanno facendo manutenzione, specialmente quando aggiungi altre cose 'utili' come pug ... Se non riesci a inferire tutte le sequenze di argomenti e le parentesi fantasma ...
Grunion Shaftoe,


21

In quasi tutte le lingue dovrebbe invece funzionare:

a = true  && 5 || 10
a = false && 5 || 10

38
Funziona, ma è molto meno chiaro e non c'è motivo di farlo in qualsiasi lingua che abbia una sintassi migliore per questo.
Ibrahim,

10
Non è equivalente in molte lingue in cui è implicita la conversione falsedi valori come 0, null, indefinito, ... e così via
Lord of the Goo

12
@Ibrahim Funziona come un ternario condizionale solo se la parte dopo il &&segno è vera, altrimenti restituirebbe l'ultima parte, che non è il modo in cui funzionano i ternari condizionali.
pepkin88,

Proprio la differenza! :)
Pierre Voisin,

di tutti gli esempi, questo è quello che troverei più complicato per dire quali sono le variabili in un dato linguaggio che potrei incontrare - in particolare un linguaggio come CoffeeScript (o Ruby) in cui gli spazi non sono sempre spazi
Toni Leigh

12

Coffeescript non supporta l' operatore ternario javascript. Ecco il motivo dell'autore del coffeescript :

Adoro gli operatori ternari tanto quanto il prossimo (probabilmente un po 'di più, in realtà), ma la sintassi non è ciò che li rende buoni - sono fantastici perché possono adattare un if / else su una singola riga come un espressione.

La loro sintassi è solo un altro po 'di magia mistificante da memorizzare, senza analoghi a nient'altro nella lingua. A parità di risultati, preferirei if/elsessempre avere lo stesso aspetto (ed essere sempre compilato in un'espressione).

Quindi, in CoffeeScript, anche gli if multilinea si compileranno in ternari quando appropriato, così come le istruzioni if ​​senza una clausola else:

if sunny   
  go_outside() 
else   
  read_a_book().

if sunny then go_outside() else read_a_book()

Entrambi diventano ternari, entrambi possono essere usati come espressioni. È coerente e non c'è nuova sintassi da imparare. Quindi, grazie per il suggerimento, ma sto chiudendo questo ticket come "wontfix".

Si prega di fare riferimento al problema github: https://github.com/jashkenas/coffeescript/issues/11#issuecomment-97802


3

Puoi anche scriverlo in due affermazioni se è principalmente vero uso:

a = 5
a = 10 if false

Oppure usa un'istruzione switch se hai bisogno di più possibilità:

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

Con un booleano può essere sovradimensionato ma lo trovo molto leggibile.


1

Versione multilinea (ad esempio se è necessario aggiungere commenti dopo ogni riga):

a = if b # a depends on b
then 5   # b is true 
else 10  # b is false

0

CoffeeScriptnon ha un operatore ternario. Questo è ciò che dicono i documenti.

Puoi ancora usare una sintassi come

a = true then 5 else 10

È molto più chiaro.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.