Scala if-else与函数调用链接

u7up0aaq  于 2023-10-18  发布在  Scala
关注(0)|答案(1)|浏览(146)

为什么condition2的行为不是我所期望的?是否有任何链接/引用指定此类行为?
根据我的理解,在condition2的情况下,.map(_ + 1)else{}结合,而我期望.map(_ + 1)if-else结合的结果

object Main {
  def main(args: Array[String]): Unit = {
    val condition: Boolean = true
    val a = if (condition) {
      Seq(1, 2, 3)
    } else {
      Seq(1, 2, 3)
    }

    val b = a.map(_ + 1)
    println(b) // Results in List(2, 3, 4)

    val condition2: Boolean = true
    val c = if (condition2) {
      Seq(1, 2, 3)
    } else {
      Seq(1, 2, 3)
    }.map(_ + 1)

    println(c) // Results in List(1,2,3), but I expect it to be List(2,3,4)

  val condition3: Boolean = false
  val d = if (condition3) {
    Seq(1, 2, 3)
  } else {
    Seq(1, 2, 3)
  }.map(_ + 1)

  println(d) // Results in List(2,3,4)
}
}

谢谢你的帮助。

8wtpewkr

8wtpewkr1#

由于Scala编译器将if (cond) a else b结构中的ab视为单独的表达式,因此在您的示例中,aSeq(1, 2, 3)b{Seq(1, 2, 3)}.map(_ + 1)(即,else之后的所有内容都是单独的表达式)。您可以将if-else Package 到括号中:

val c = (if (condition2) {
           Seq(1, 2, 3)
         } else {
           Seq(1, 2, 3)
         }).map(_ + 1)

而且它会像预期的那样工作。
另请参阅Scala 2.13的条件表达式规范。

相关问题