2012-04-13 18 views
290

È necessario impostare il valore su a che dipende da una condizione.Funzionamento ternario in CoffeeScript

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

E.g. questo è come lo farei in JavaScript:

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

possibile duplicato (http://stackoverflow.com/questions/8170468/conditional-operator-in-coffeescript) –

+115

Vorrei che lo script del caffè avesse potuto solo supportare la sintassi dell'operatore ternario, è più breve e più facile da leggere rispetto a "altrimenti" AJP

+0

Boo. Questo non va bene. I ternari possono essere piacevoli a volte. –

risposta

487

Dal momento che tutto è espressione, e, quindi, si traduce in un valore, si può semplicemente usare if/else.

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

Si può vedere di più su esempi di espressione here.

+6

Suppongo che ci sia un motivo per cui coffeescript non supporta la sintassi ternaria predefinita javascript? –

+30

Il motivo è la preferenza dell'autore per qualcosa di "meno criptico" e meno arbitrario (ad es. Https://github.com/jashkenas/coffeescript/issues/11#issuecomment-97802). [I miei 2 centesimi - Mentre mi rendo conto dell'arbitrarietà di?:, Penso che "if..then..else" sia troppo prolisso per sostituire quella che dovrebbe essere un'espressione concisa. E?: Dopotutto è uno standard molto radicato tra molte lingue, tra cui JavaScript. Nonostante tutto, sembra essere scolpito in questa fase.] – mahemoff

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

Vedere documentation.

+8

@MattHumphrey 200 upvotes = 2000 rep – Stephan

22

In quasi tutte le lingue questo dovrebbe funzionare, invece:

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

Questo funziona, ma è molto meno chiaro e non c'è motivo di farlo in qualsiasi linguaggio che abbia una sintassi migliore per esso . – Ibrahim

+8

Non è equivalente in molte lingue dove c'è una conversione implicita a 'false' di valori come 0, null, indefinito, ... e così via –

+9

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

3

Forse potresti scriverlo in due prospetti se la maggior parte è vero uso:

a = 5 
a = 10 if false 

o utilizzare un'istruzione switch se avete bisogno maggiori possibilità:

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

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

10

Coffeescript non supporta javascript operatore ternario. Ecco la ragione da parte dell'autore CoffeeScript:

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

La loro sintassi è solo un altro po 'di mistificazione della magia da memorizzare, con non analogo a nient'altro nella lingua. Il risultato è uguale, Preferirei avere lo stesso if/elses sempre uguale (e sempre essere compilato in un'espressione).

Così, in CoffeeScript, anche IFS multilinea saranno compilare in ternari se del caso, come volontà se le dichiarazioni 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 utilizzati come espressioni. È coerente e non c'è una nuova sintassi da imparare. Quindi, grazie per il suggerimento, ma sto chiudendo questo ticket come "wontfix".

prega di fare riferimento alla questione GitHub: https://github.com/jashkenas/coffeescript/issues/11#issuecomment-97802

0

versione multilinea (ad esempiose è necessario aggiungere un commento dopo ogni riga): [? Operatore condizionale in CoffeeScript]

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