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
.
Scala规范在第6.19节"For Forrehence and For Loops"中清楚地描述了这种行为:
生成器p < - e后跟值定义p'= e'被转换为下面的值对生成器,其中x和x'是新名称:
Run Code Online (Sandbox Code Playgroud)(p, p') <- for ( x@p <- e ) yield { val x'@p' = e' ; (x, x') }
作为一个例子,代码
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)
其中元组的第二个值被丢弃的地方.