三元运算符处于折叠状态的问题

问题描述 投票:1回答:2

考虑一个简单的Collection,一次迭代搜索最小值和最大值:

val v = Vector (2, 1, 3, 5, 4)
val mima = (v(0), v(0))
val mami = (mima /: v) {case ((a, b), c) => if (c<a) (c, b) else if (c>b) (a, c) else (a, b)}

到目前为止,很简单。如果我用三元运算符(X?Y:Z)替换if / else,它将不起作用;我收到一个错误:

    val mami = (mima /: v) {case ((a, b), c) => (c<a) ? (c, b) : (c>b) ? (a, c) : (a, b)}
<console>:1: ';' expected but : found. 

在最后一个冒号。添加括号没有帮助:

    val mami = (mima /: v) {case ((a, b), c) => (c<a) ? (c, b) : ((c>b) ? (a, c) : (a, b))}

我犯了一个愚蠢的错误,还是嵌套三元运算符有一个微妙的问题?

解决此问题,仅与折叠无关:

if (c < 4) "small" else if (c > 8) "big" else "medium"

作品

(c < 4) ? "small" : (c > 8) ? "big" : "medium" 

失败的方法相同。

scala ternary-operator
2个回答
4
投票

Scala没有三元运算符,因为它具有if作为表达式,因此您可以执行以下操作:

val result = if (c < 4) "small" else if (c > 8) "big" else "medium"

您也可以折叠使用:

val mami = (mima /: v) {case ((a, b), c) => if (c<a) (c, b) else if (c>b) (a, c) else (a, b)) }

1
投票

[哈哈,抱歉,伙计们!

简单的解决方案是:Scala中没有Elvis运算符。 :)哎呀,我怎么能忘记呢?

(a < 4) ? foo : bar 

不是比]短很多>

if (a < 4) foo; else bar

并且与Java相反,Scala从if / else语句返回一个值,因此您不需要它。

© www.soinside.com 2019 - 2024. All rights reserved.