斯卡拉代码:
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}
元组的第二个值被丢弃。