【问题标题】:Scala assign inside an if conditionScala 在 if 条件内分配
【发布时间】:2012-10-11 19:06:28
【问题描述】:
val flag = false

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

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

【问题讨论】:

  • 你为什么要写这样的代码?在if 的主体内,data 始终是true,那么为什么要使用val data
  • 目前还很不清楚,你想在这里实现什么。而不是将data 分配给flag 的值,您可以只使用标志,无论如何它都在范围内。请说明你想做什么。

标签: scala


【解决方案1】:

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

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

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

def test(data: Boolean) {
  if (data) {/* data in scope */} 
  else      {/* data in scope */}}

【讨论】:

  • 从你的第一个示例代码开始,是否可以在整个if block 中使用data
  • 不,不幸的是,它只在大括号内的范围内,如果你需要分配和测试然后在if的主体中使用,那么看起来你应该声明一个var(这需要丢弃分配)在包含if 的外部范围内。然而,使用vars 比能够在if 的条件部分的范围内分配、测试和使用更需要考虑。
【解决方案2】:

有一个很好的扩展功能可以帮助您处理您的案件和许多其他问题。您可以使用以下隐式转换来实现它:

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

【讨论】:

    猜你喜欢
    • 2020-08-26
    • 2012-02-26
    • 1970-01-01
    • 2021-12-08
    • 2015-03-29
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多