Scala if-else 与函数调用链接

guo*_*guo 1 scala

为什么在这种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)
}
}

Run Code Online (Sandbox Code Playgroud)

预先感谢您的任何帮助。

Gur*_*ron 5

因为 Scala 编译器将aand binif (cond) a else b构造为单独的表达式,所以在您的情况下aisSeq(1, 2, 3)bis {Seq(1, 2, 3)}.map(_ + 1)(即后面的所有内容else都是单独的表达式)。您可以将其包含if-else在括号中:

val c = (if (condition2) {
           Seq(1, 2, 3)
         } else {
           Seq(1, 2, 3)
         }).map(_ + 1)
Run Code Online (Sandbox Code Playgroud)

它会按预期工作。

另请参阅Scala 2.13 的条件表达式规范。