在 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
.
我提供了一个我想出的基本实现;欢迎对这种风格/技术和/或更好的实现发表一般评论!