Operación ternaria en CoffeeScript

318

Necesito establecer un valor para aeso depende de una condición.

¿Cuál es la forma más corta de hacer esto con CoffeeScript?

Por ejemplo, así es como lo haría en JavaScript:

a = true  ? 5 : 10  # => a = 5
a = false ? 5 : 10  # => a = 10
evfwcqcg
fuente
120
<rant> Desearía que la secuencia de comandos de café pudiera haber sido compatible con la sintaxis del operador ternario, es más corta y fácil de leer que if else then </rant>
AJP
2
@AJP Creo que el ternario haría que el café sea menos Ruby-ish, a pesar de que Ruby tiene eso. El objetivo con el café siempre es la legibilidad y el redondeo de las esquinas.
jcollum
37
@jcollum estuvo de acuerdo, pero lo que realmente me parece más inquietante es que a = true ? 5 : 10es un coffeescript válido, pero no significa una estructura ternaria, sino que (en javascript) significa: lo a = true ? true : {5:10}que se conoce como algo malo® Además a = false ? {5 : 10}en coffeescript entonces (en javascript) es equivalente a: a = true ? false : {5:10} Por lo que vale, no creo que sea bueno.
AJP
2
Puede ser mejor deletrear si ... luego ... para CoffeeScript. Los ? como operador de existencia tiene mucho sentido: beast = yeti ? "bear"o if yeti? then alert "It's a yeti!"hace el uso ?bastante bien.
Paul Oliver
3
El operador ternario separado no es realmente necesario en CoffeeScript, ya que if/then/elsees una expresión y hace lo mismo. Si realmente lo falta, entonces está más acostumbrado a la sintaxis de C o JavaScript que realmente lo necesita. Si no es lo suficientemente legible, y a veces sucede, simplemente envuelva la expresión completa entre paréntesis. El operador ?se ha ahorrado para verificaciones más útiles que están ausentes en JavaScript, como ya dijo @PaulOliver. El operador existencial es el mejor.
skalee

Respuestas:

544

Como todo es una expresión y, por lo tanto, da como resultado un valor, puede usarlo if/else.

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

Puede ver más sobre ejemplos de expresiones aquí .

loganfsmyth
fuente
8
¿Supongo que hay una razón para que coffeescript no admita la sintaxis ternaria predeterminada de JavaScript?
Augustin Riedinger
41
La razón es la preferencia del creador por algo "menos críptico" y menos arbitrario (por ejemplo, github.com/jashkenas/coffeescript/issues/11#issuecomment-97802 ). [Mis 2 centavos - Si bien me doy cuenta de la arbitrariedad de?:, Creo que if..then..elsees un reemplazo demasiado detallado para lo que se supone que es una expresión concisa. Y?: Después de todo, es un estándar muy arraigado entre muchos idiomas, JavaScript entre ellos. A pesar de todo eso, parece estar
escrito
1
Estoy de acuerdo con el autor de CoffeeScript, siempre pensé que la sintaxis ternaria era AF fea y poco intuitiva. Si puede usar if then elseen la misma línea, hágalo, son 7 caracteres adicionales para mucha más claridad y elegancia.
Joshua Pinter el
Depende del gusto, pero tengo una gran preferencia por los símbolos sobre las palabras clave, como ->over functiono { }over begin .. end, porque me gusta ver una alta relación señal / ruido, donde las palabras están reservadas para la lógica específica de la función y la lógica operativa está principalmente relegada a los símbolos
mahemoff
Toda la campaña para eliminar lo que son estructuras de lenguaje cruzado muy estándar realmente enloquece a las personas que realizan tareas de mantenimiento, especialmente cuando agrega otras cosas 'útiles' como pug ... Si no puede inferir todas las secuencias de argumentos y paréntesis fantasma ...
Grunion Shaftoe
21

En casi cualquier idioma, esto debería funcionar en su lugar:

a = true  && 5 || 10
a = false && 5 || 10
Alexander Senko
fuente
38
Esto funciona, pero es mucho menos claro y no hay razón para hacerlo en ningún idioma que tenga una mejor sintaxis.
Ibrahim
10
No es equivalente en muchos idiomas donde hay una conversión implícita falsede valores como 0, nulo, indefinido, ... y así sucesivamente
Lord of the Goo
12
@Ibrahim Esto funciona como un ternario condicional solo si la parte posterior a la &&marca es verdadera, de lo contrario devolvería la última parte, que no es cómo funcionan los terrarios condicionales.
pepkin88
Precisamente, la diferencia! :)
Pierre Voisin
De todos los ejemplos, este es el que me resultaría más difícil decir cuáles son las variables en un lenguaje determinado que pueda encontrar, especialmente un idioma como CoffeeScript (o Ruby) donde los espacios no siempre son espacios
Toni Leigh
12

Coffeescript no admite el operador ternario de javascript. Aquí está la razón del autor del coffeescript :

Me encantan los operadores ternarios tanto como el siguiente tipo (probablemente un poco más, en realidad), pero la sintaxis no es lo que los hace buenos, son geniales porque pueden caber un if / else en una sola línea como un expresión.

Su sintaxis es solo otro poco de magia desconcertante para memorizar, sin análogo a nada más en el idioma. Si el resultado es igual, preferiría tener if/elsessiempre el mismo aspecto (y siempre estar compilado en una expresión).

Entonces, en CoffeeScript, incluso los ifs de varias líneas se compilarán en ternarios cuando sea apropiado, al igual que las declaraciones if sin una cláusula else:

if sunny   
  go_outside() 
else   
  read_a_book().

if sunny then go_outside() else read_a_book()

Ambos se convierten en terrarios, ambos pueden usarse como expresiones. Es consistente y no hay una nueva sintaxis para aprender. Entonces, gracias por la sugerencia, pero estoy cerrando este ticket como "wontfix".

Consulte el problema de github: https://github.com/jashkenas/coffeescript/issues/11#issuecomment-97802

Max Peng
fuente
3

También puede escribirlo en dos declaraciones si en su mayoría es un uso verdadero:

a = 5
a = 10 if false

O use una declaración de cambio si necesita más posibilidades:

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

Con un booleano puede ser de gran tamaño, pero me parece muy legible.

Alinex
fuente
1

Versión multilínea (por ejemplo, si necesita agregar comentarios después de cada línea):

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

CoffeeScriptno tiene operador ternario. Eso es lo que dicen los documentos.

Todavía puedes usar una sintaxis como

a = true then 5 else 10

Es mucho más claro.

Эд Лесничий
fuente