简体   繁体   中英

Ternary operation in CoffeeScript

I need to set value to a that depends on a condition.

What is the shortest way to do this with CoffeeScript?

Eg this is how I'd do it in JavaScript:

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

Since everything is an expression, and thus results in a value, you can just use if/else .

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

You can see more about expression examples here .

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

See documentation .

In almost any language this should work instead:

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

Coffeescript doesn't support javascript ternary operator. Here is the reason from the coffeescript author :

I love ternary operators just as much as the next guy (probably a bit more, actually), but the syntax isn't what makes them good -- they're great because they can fit an if/else on a single line as an expression.

Their syntax is just another bit of mystifying magic to memorize, with no analogue to anything else in the language. The result being equal, I'd much rather have if/elses always look the same (and always be compiled into an expression).

So, in CoffeeScript, even multi-line ifs will compile into ternaries when appropriate, as will if statements without an else clause:

 if sunny go_outside() else read_a_book(). if sunny then go_outside() else read_a_book() 

Both become ternaries, both can be used as expressions. It's consistent, and there's no new syntax to learn. So, thanks for the suggestion, but I'm closing this ticket as "wontfix".

Please refer to the github issue: https://github.com/jashkenas/coffeescript/issues/11#issuecomment-97802

You may also write it in two statements if it mostly is true use:

a = 5
a = 10 if false

Or use a switch statement if you need more possibilities:

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

With a boolean it may be oversized but i find it very readable.

Multiline version (eg if you need to add comment after each line):

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

CoffeeScript has no ternary operator. That's what the docs say.

You can still use a syntax like

a = true then 5 else 10

It's way much clearer.

Similar to quotesBro's answer , but without the then keyword. Here's a version that uses a normal, multiline if statement. To me, this is formatted nicely.

Consider this normal if statement

if true
    # do stuff
else
    # do stuff

Then use it for assignment (again, without the then keyword)

value = if true
    5
else
    10

value = if false
    5
else
    10

This compiles to javascript as exactly a regular ternary

value = true ? 5 : 10;
value = false ? 5 : 10;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM