斯卡拉代码:

val list = List(1, 2, 3)
for {
  item <- list
  _ = println("1111111111")
} yield {
  println("XXXXXXXXX")
  item + 1
}

我希望它打印:
1111111111
XXXXXXXXX
1111111111
XXXXXXXXX
1111111111
XXXXXXXXX

但实际上它打印:
1111111111
1111111111
1111111111
XXXXXXXXX
XXXXXXXXX
XXXXXXXXX

我无法理解这一点,因为我认为代码将扩展为:
val list = List(1, 2, 3)
list.map { item =>
  val _ = println("1111111111")
  println("XXXXXXXXX")
  item + 1
}

哪个应该在每个循环中的 XXXXXXXX 之前打印 11111111

最佳答案

Scala 规范,第 6.19 节
“For Comprehensions and For Loops”,清楚地描述了行为:



例如,代码

for {x <- xs; y = 1} yield {x+y}

脱糖为
xs.map{x => val y = 1; (x,y)}.map{ case (x,y) => x+y}

在你的情况下,这将是
xs.map{x => val x$1 = println("1"); (x,x$1)}.map{ case (x,_) => x+1}

元组的第二个值被丢弃。

10-08 12:48