在Scala中,我逐渐失去了以控制流方式思考的Java/C习惯,并且习惯于继续前进并首先得到我感兴趣的对象,然后通常应用类似a match或a map()或foreach()for的东西.集合.我非常喜欢它,因为它现在感觉像构建我的代码更自然,更直接的方式.
渐渐地,我希望我能以相同的方式为条件编程; 即,首先获得一个布尔值,然后match它做各种事情.match然而,对于这项任务来说,全面而言似乎有点过分.
相比:
obj.isSomethingValid match {
case true => doX
case false => doY
}
Run Code Online (Sandbox Code Playgroud)
与我更接近Java的风格相比:
if (obj.isSomethingValid)
doX
else
doY
Run Code Online (Sandbox Code Playgroud)
然后我想起了Smalltalk ifTrue:和ifFalse:消息(及其变体).可以在Scala中写这样的东西吗?
obj.isSomethingValid ifTrue doX else doY
Run Code Online (Sandbox Code Playgroud)
与变种:
val v = obj.isSomethingValid ifTrue someVal else someOtherVal
// with side effects
obj.isSomethingValid ifFalse {
numInvalid += 1
println("not valid")
}
Run Code Online (Sandbox Code Playgroud)
此外,这种风格可以用于简单的两种类型Option吗?我知道使用更习惯的方法Option是把它作为一个集合和呼叫filter(),map(),exists()就可以了,但往往在最后,我发现我需要执行一些doX,如果它被定义,有的doY如果事实并非如此.就像是:
val …Run Code Online (Sandbox Code Playgroud)