val flag = false
if (val data = flag) {
println(data)
}
是否可以在if语句中分配flag
并在Scala中自动评估?
答案 0 :(得分:5)
是的,但它不会逃避范围,因此您无法在if
的正文中使用它if ({val data = true; data})
println("data was true")
分配不返回值,但您可以返回它。最好做一些像
这样的事情def test(data: Boolean) {
if (data) {/* data in scope */}
else {/* data in scope */}}
答案 1 :(得分:3)
有一个很好的扩展功能,可以帮助您的案件和许多其他人。您可以使用以下隐式转换来实现它:
implicit class AnyExtensions[A](val x: A) extends AnyVal {
def asSatisfying(p: A => Boolean): Option[A] =
if (p(x)) Some(x) else None
}
将其导入范围后,您可以使用您的示例执行以下操作:
flag.asSatisfying(_).foreach(println)
在this answer中详细解释了一些更好的用例。
这个函数的主要优点是它允许你有效地消除引入中间变量的需要,从而使你能够将任何“if-else”逻辑解决为单行表达式。