2
val flag = false

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

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

4

2 回答 2

6

是的,但它不会超出范围,因此您不能在 if 的正文中使用它

if ({val data = true; data}) 
  println("data was true")

赋值不会返回值,但您可以返回它。最好做类似的事情

def test(data: Boolean) {
  if (data) {/* data in scope */} 
  else      {/* data in scope */}}
于 2012-10-11T06:08:48.833 回答
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)

在这个答案中有一些更好的用例详细解释了它。

此函数的主要优点是它允许您有效地消除引入中间变量的需要,从而使您能够将任何“if-else”逻辑解决为单行表达式。

于 2012-10-11T11:00:48.353 回答