Scala在if条件中分配

时间:2012-10-11 05:10:31

标签: scala

val flag = false

if (val data = flag) {
  println(data)
}

是否可以在if语句中分配flag并在Scala中自动评估?

2 个答案:

答案 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”逻辑解决为单行表达式。