在 Scala 中,我逐渐失去了 Java/C 以面向控制流的方式思考的习惯,并习惯于先获取我感兴趣的对象,然后通常应用诸如 amatch或 amap()或foreach()for之类的东西收藏品。我非常喜欢它,因为它现在感觉像是一种更自然、更直接的方式来构建我的代码。
渐渐地,我希望我能以同样的方式为条件编程;即,首先获得一个布尔值,然后match它来做各种事情。match然而,对于这项任务来说,一个成熟的 .
比较:
obj.isSomethingValid match {
case true => doX
case false => doY
}
与我用更接近 Java 的风格编写的内容相比:
if (obj.isSomethingValid)
doX
else
doY
然后我想起了 SmalltalkifTrue:和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.
我提供了一个我想出的基本实现;欢迎对这种风格/技术和/或更好的实现发表一般评论!