Operação ternária no CoffeeScript


318

Eu preciso definir o valor para aque depende de uma condição.

Qual é a maneira mais curta de fazer isso com o CoffeeScript?

Por exemplo, é assim que eu faria em JavaScript:

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

120
<rant> Desejo coffeescript poderia ter apoiado a sintaxe operador ternário, é mais curto e mais fácil de ler do que if else then </ discurso>
AJP

2
@AJP Acho que o ternário tornaria o café menos Ruby-ish, embora Ruby tenha isso. O objetivo do café é sempre a legibilidade e o arredondamento dos cantos difíceis.
jcollum

37
@jcollum concordou, mas o que realmente acho que é o mais inquietantes que a = true ? 5 : 10é CoffeeScript válido, mas não significa uma estrutura ternária, em vez (em javascript) que significa: a = true ? true : {5:10}o que é conhecido como um mau thing® Além disso a = false ? {5 : 10}, em CoffeeScript seguida (em javascript) é equivalente a: a = true ? false : {5:10} pelo que vale, não acho que seja bom.
AJP

2
Pode ser o melhor modo de especificar, se ... depois ... o CoffeeScript. O ? como um operador de existência, faz muito sentido: beast = yeti ? "bear"ou if yeti? then alert "It's a yeti!"usa ?muito bem.
Paul Oliver

3
O operador ternário separado não é realmente necessário no CoffeeScript, pois if/then/elsejá é uma expressão e faz a mesma coisa. Se você realmente está sentindo falta disso, está mais acostumado à sintaxe C ou JavaScript do que realmente precisa. Se não for legível o suficiente, e às vezes acontece, basta colocar toda a expressão entre parênteses. O operador ?foi poupado para verificações mais úteis ausentes no JavaScript, como já foi declarado por @PaulOliver. Operador existente é o melhor.
skalee

Respostas:


544

Como tudo é uma expressão e, portanto, resulta em um valor, você pode apenas usar if/else.

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

Você pode ver mais sobre exemplos de expressão aqui .


8
Eu acho que há uma razão para o coffeescript não suportar a sintaxe ternária padrão do javascript?
Augustin Riedinger 30/10

41
O motivo é a preferência do criador por algo "menos enigmático" e menos arbitrário (por exemplo, github.com/jashkenas/coffeescript/issues/11#issuecomment-97802 ). [Meus 2 centavos - Embora eu perceba a arbitrariedade de?:, Acho que if..then..elseé uma substituição muito detalhada para o que deveria ser uma expressão concisa. E?: Afinal é um padrão muito arraigado entre muitas linguagens, JavaScript entre elas. Não obstante tudo isso, parece ser gravada na pedra nesta fase].
mahemoff

1
Eu concordo com o autor do CoffeeScript, sempre achei a sintaxe ternária um AF feio e pouco intuitivo. Se você pode usar if then elsena mesma linha, faça, são 7 caracteres adicionais para muito mais clareza e elegância.
Joshua Pinter

Depende do gosto, mas eu tenho uma forte preferência por símbolos sobre palavras-chave, tais como ->mais functionou { }mais begin .. end, porque eu gosto de ver um sinal de alta-ruído, onde as palavras são reservados para a lógica específica de função e a lógica operacional é principalmente relegado para símbolos.
mahemoff 21/01

Toda a unidade para remover o que são estruturas de linguagem cruzada muito comuns realmente acaba com as pessoas que estão fazendo manutenção, especialmente quando você adiciona outras coisas 'úteis' como pug ... Se você não pode inferir todas as seqüências de argumentos e parênteses de fantasmas ...
Grunion Shaftoe 30/01


21

Em quase qualquer idioma, isso deve funcionar:

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

38
Isso funciona, mas é muito menos claro e não há razão para fazê-lo em qualquer idioma que possua uma sintaxe melhor.
Ibrahim

10
Não é equivalente em muitas línguas onde há conversão implícita a falsede valores como 0, null, indefinido, ... e assim por diante
Lord of the Goo

12
@Ibrahim Isso funciona como um ternário condicional apenas se a parte após a &&marca for verdadeira; caso contrário, retornaria a última parte, que não é como os ternários condicionais funcionam.
pepkin88

Precisamente, a diferença! :)
Pierre Voisin

de todos os exemplos, esse é o que eu acho mais difícil de dizer quais são as variáveis ​​em qualquer linguagem que eu possa encontrar - especialmente uma linguagem como CoffeeScript (ou Ruby), onde os espaços nem sempre são espaços
Toni Leigh

12

Coffeescript não suporta operador ternário javascript. Aqui está o motivo do autor do coffeescript :

Eu amo operadores ternários tanto quanto o próximo cara (provavelmente um pouco mais, na verdade), mas a sintaxe não é o que os torna bons - eles são ótimos porque podem caber um if / else em uma única linha como um expressão.

A sintaxe deles é apenas mais um pouco de mágica misteriosa para memorizar, sem analogia com qualquer outra coisa na linguagem. Sendo o resultado igual, prefiro if/elsessempre ter a mesma aparência (e sempre ser compilado em uma expressão).

Portanto, no CoffeeScript, mesmo ifs de várias linhas serão compilados em ternários quando apropriado, assim como as instruções if sem uma cláusula else:

if sunny   
  go_outside() 
else   
  read_a_book().

if sunny then go_outside() else read_a_book()

Ambos se tornam ternários, ambos podem ser usados ​​como expressões. É consistente e não há nova sintaxe para aprender. Então, obrigado pela sugestão, mas estou fechando este ticket como "wontfix".

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


3

Você também pode escrevê-lo em duas instruções se o uso for verdadeiro:

a = 5
a = 10 if false

Ou use uma instrução switch se precisar de mais possibilidades:

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

Com um booleano, pode ser muito grande, mas acho muito legível.


1

Versão multilinha (por exemplo, se você precisar adicionar um comentário após cada linha):

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

0

CoffeeScriptnão possui operador ternário. É o que dizem os médicos.

Você ainda pode usar uma sintaxe como

a = true then 5 else 10

É muito mais claro.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.