如何理解`for`和`yield`中的"println"语句

Fre*_*ind 4 for-loop scala map

Scala代码:

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

我希望它打印:

1111111111
XXXXXXXXX
1111111111
XXXXXXXXX
1111111111
XXXXXXXXX
Run Code Online (Sandbox Code Playgroud)

但实际上它打印:

1111111111
1111111111
1111111111
XXXXXXXXX
XXXXXXXXX
XXXXXXXXX
Run Code Online (Sandbox Code Playgroud)

我无法理解这一点,因为我认为代码将扩展为:

val list = List(1, 2, 3)
list.map { item =>
  val _ = println("1111111111")
  println("XXXXXXXXX")
  item + 1
}
Run Code Online (Sandbox Code Playgroud)

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

kir*_*uku 6

Scala规范在第6.19节"For Forrehence and For Loops"中清楚地描述了这种行为:

生成器p < - e后跟值定义p'= e'被转换为下面的值对生成器,其中x和x'是新名称:

(p, p') <- for ( x@p <- e ) yield { val x'@p' = e' ; (x, x') }
Run Code Online (Sandbox Code Playgroud)

作为一个例子,代码

for {x <- xs; y = 1} yield {x+y}
Run Code Online (Sandbox Code Playgroud)

很沮丧

xs.map{x => val y = 1; (x,y)}.map{ case (x,y) => x+y}
Run Code Online (Sandbox Code Playgroud)

在你的情况下,它会

xs.map{x => val x$1 = println("1"); (x,x$1)}.map{ case (x,_) => x+1}
Run Code Online (Sandbox Code Playgroud)

其中元组的第二个值被丢弃的地方.