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.