CoffeeScript中的三元运算


318

我需要根据条件设置值a

用CoffeeScript做到这一点的最短方法是什么?

例如,这就是我在JavaScript中的处理方式:

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

120
<rant>我希望coffee脚本可以只支持三元运算符语法,比if else then </ rant> 更短,更容易阅读
AJP 2012年

2
@AJP我认为,即使Ruby有这种功能,三元也会减少咖啡的Ruby风味。咖啡的目标始终是可读性和四舍五入。
jcollum

37
@jcollum同意,但是真正令我最a = true ? 5 : 10困扰的是有效的coffeescript,但并不意味着三元结构,而是(在javascript中)它的意思是:a = true ? true : {5:10}这被称为是一件坏事®另外a = false ? {5 : 10}在coffeescript中,然后(在javascript中)是等效于:a = true ? false : {5:10} 就其价值而言,我认为这并不好。
AJP

2
如果“ .then..else”用于CoffeeScript,则可能是最好的拼写方式。?作为一个存在运算符很有意义:beast = yeti ? "bear"或者if yeti? then alert "It's a yeti!"使用?得很好。
Paul Oliver

3
在CoffeeScript中,实际上并不需要单独的三元运算符,因为if/then/else它已经是一个表达式,并且执行相同的操作。如果您真的很想念它,那么您宁愿不习惯C或JavaScript语法。如果可读性不够,有时甚至会发生,只需将整个表达式括在括号中即可。?正如@PaulOliver所说的,运算符已被JavaScript遗忘了一些更有用的检查。存在的运算符是最好的。
skalee 2014年

Answers:


544

由于所有内容都是表达式,因此可以产生值,因此您可以使用if/else

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

您可以在此处查看有关表达式示例的更多信息。


8
我猜有一个原因使coffeescript不支持javascript默认三元语法吗?
奥古斯丁·里丁格

41
原因是创建者偏爱某种“较少隐秘”且较少随意的内容(例如github.com/jashkenas/coffeescript/issues/11#issuecomment-97802)。[我的2美分-当我意识到?:的任意性时,我认为if..then..else代替一个简洁的表述过于冗长。?:毕竟是许多语言中非常根深蒂固的标准,其中包括JavaScript。尽管如此,它似乎在这个阶段
已经定下来

1
我同意CoffeeScript作者的观点,我一直认为三元语法很丑陋且不直观。如果您可以if then else在同一行上使用它,那么它是另外7个字符,可以使您更加清晰和优雅。
约书亚·品特

取决于品味,但我对符号的偏爱要强于关键字,例如->over function{ }over begin .. end,因为我喜欢看到较高的信噪比,其中字保留给特定功能的逻辑,而操作逻辑则大多降级到符号。
mahemoff

删除非常标准的跨语言结构的整个驱动器实际上只是在拧螺丝,这正在维护人员,特别是当您添加其他“有用的”东西(例如pug)时……如果您无法推断所有参数序列和幻影括号, ...
Grunion Shaftoe


21

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

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

38
这行得通,但尚不清楚,也没有理由使用任何语法更好的语言来做到这一点。
易卜拉欣

10
在许多语言中,这些语言都隐式转换为false诸如0,null,undefined等之类的值,这并不等效
Goo的主人

12
@Ibrahim &&标记后的部分为真时,它用作条件三元,否则它将返回最后一部分,这不是条件三元的工作方式。
pepkin88

精确地,差异!:)
Pierre Voisin

在所有示例中,这是我发现要告诉我可能遇到的任何给定语言中的变量的最棘手的示例-特别是像CoffeeScript(或Ruby)之类的语言,其中空格并不总是空格
Toni Leigh

12

Coffeescript 不支持 javascript三元运算符。这是来自咖啡作者的原因:

我对三元运算符的爱与对下一个运算符的爱一样多(实际上可能更多),但是语法并不是使它们变好的原因-它们很棒,因为它们可以将if / else放在一行上表达。

它们的语法只是令人难以置信的不可思议的魔力,与该语言中的其他任何事物都没有类似之处。结果相等,我宁愿if/elses看起来总是一样的(总是编译成表达式)。

因此,在CoffeeScript中,即使多行ifs也将在适当时编译为三进制,而if语句不包含else子句也将:

if sunny   
  go_outside() 
else   
  read_a_book().

if sunny then go_outside() else read_a_book()

两者都变成三元,都可以用作表达式。这是一致的,没有新的语法需要学习。因此,感谢您的建议,但我以“ wontfix”的身份关闭了这张票。

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


3

如果大多数情况下是真实使用的话,也可以用两个语句编写它:

a = 5
a = 10 if false

如果需要更多可能性,请使用switch语句:

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

布尔值可能会过大,但我觉得它可读性强。


1

多行版本(例如,如果您需要在每行之后添加注释):

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

0

CoffeeScript没有三元运算符。那就是文档所说的。

您仍然可以使用如下语法

a = true then 5 else 10

要清楚得多。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.