match
、map()
或foreach()
这样的操作。我非常喜欢它,因为现在感觉代码结构更自然、更直接。渐渐地,我希望能够以同样的方式编写条件语句;即先获取布尔值,然后再使用
match
执行各种操作。但是,完全使用match
似乎有点过头了。比较一下:
obj.isSomethingValid match {
case true => doX
case false => doY
}
与我使用更接近Java的风格所写的内容相比:
if (obj.isSomethingValid)
doX
else
doY
然后我想起了Smalltalk的ifTrue:
和ifFalse:
消息(以及类似的变体)。在Scala中能否编写类似的内容?
obj.isSomethingValid ifTrue doX else doY
带有变体:
val v = obj.isSomethingValid ifTrue someVal else someOtherVal
// with side effects
obj.isSomethingValid ifFalse {
numInvalid += 1
println("not valid")
}
此外,这种风格是否可用于像
Option
这样的简单二状态类型?我知道使用Option
的更惯用方法是将其视为集合并在其上调用filter()
、map()
、exists()
,但通常,在最后,我发现如果它被定义了,我想执行一些doX
,如果没有,则执行一些doY
。类似于:val ok = resultOpt ifSome { result =>
println("Obtained: " + result)
updateUIWith(result) // returns Boolean
} else {
numInvalid += 1
println("missing end result")
false
}
在我看来,这个(依然?)比一个完整的match
看起来更好。
我提供了一个我想到的基础实现;欢迎对这种风格/技术进行一般性评论和/或更好的实现!
if
,但是针对Option
的简单match
呢? - Jean-Philippe PelletOption
,有getOrElse
。 - Madoc