CoffeeScript中的三元操作

evf*_*qcg 313 javascript ternary-operator coffeescript

我需要设置值a取决于条件.

使用CoffeeScript执行此操作的最短方法是什么?

这就是我在JavaScript中的表现:

a = true  ? 5 : 10  # => a = 5
a = false ? 5 : 10  # => a = 10
Run Code Online (Sandbox Code Playgroud)

log*_*yth 536

因为一切都是表达式,因此产生一个值,所以你可以使用if/else.

a = if true then 5 else 10
a = if false then 5 else 10
Run Code Online (Sandbox Code Playgroud)

你可以看到更多的表达的例子在这里.

  • 原因是创作者倾向于"不那么神秘"而且不那么随意(例如,https://github.com/jashkenas/coffeescript/issues/11#issuecomment-97802).[我的2美分 - 虽然我意识到?:的任意性,但我认为`if..then..else`是一个过于冗长的替代,应该是一个简洁的表达.并且?:毕竟是许多语言中非常根深蒂固的标准,其中包括JavaScript.尽管如此,在这个阶段似乎仍然是一成不变的. (41认同)
  • 我想有一个原因是coffeescript不支持javascript默认的三元语法? (7认同)
  • 删除非常标准的跨语言结构的整个驱动力实际上只会让进行维护的人员陷入困境,尤其是当您添加其他“有用”的东西(例如 pug)时......如果您无法推断出所有参数序列和幽灵括号... (2认同)

Pau*_*ver 68

a = if true then 5 else 10
a = if false then 5 else 10 
Run Code Online (Sandbox Code Playgroud)

文档.

  • @MattHumphrey 200 upvotes = 2000 rep (8认同)

小智 21

在几乎任何语言中,这应该起作用:

a = true  && 5 || 10
a = false && 5 || 10
Run Code Online (Sandbox Code Playgroud)

  • 这是有效的,但它远没有那么明确,没有理由在任何具有更好语法的语言中做到这一点. (37认同)
  • @Ibrahim这只作为一个条件三元****如果`&&`标记之后的部分是真实的,否则它会返回最后一部分,这不是条件三元的工作方式. (11认同)
  • 它在许多语言中都不相同,其中隐含地转换为诸如0,null,undefined等的值的"false"等等. (10认同)

Max*_*eng 11

Coffeescript 不支持 javascript三元运算符.以下是coffeescript作者的原因:

我喜欢三元运算符和下一个运算符一样多(实际上可能更多一点),但语法并不能使它们变得更好 - 它们很棒,因为它们可以将if/else放在一行上作为一个表达.

他们的语法只是记忆中另一种神秘的魔法,与语言中的任何其他东西都不相似.结果相同,我宁愿if/elses总是看起来一样(并且总是被编译成表达式).

因此,在CoffeeScript中,即使是多行ifs也会在适当的时候编译为三元组,if if语句也没有else子句:

if sunny   
  go_outside() 
else   
  read_a_book().

if sunny then go_outside() else read_a_book()
Run Code Online (Sandbox Code Playgroud)

两者都成为三元,都可以用作表达.它是一致的,没有新的语法可供学习.所以,谢谢你的建议,但我关闭这张票是"wontfix".

请参考github问题:https://github.com/jashkenas/coffeescript/issues/11#issuecomment-97802