【发布时间】:2020-02-20 19:51:20
【问题描述】:
我有以下理解,我使用命令scala -Xprint:parser ForComprehensionDemo.scala 去糖。当我复制去糖方法并调用它时,它会产生与理解不同的结果。知道为什么吗?
为了理解:
object ForComprehensionDemo {
def main(args: Array[String]): Unit = {
forWithIf(true)
}
def forWithIf(condition: Boolean) = {
val x = for {
a <- name(0)
b <- if (condition) {
name(1)
name(2)
} else {
name(100)
}
c <- name(2)
} yield {
a + b + c
}
println(x)
}
def name(x: Int): Option[String] = {
println("called for :" + x)
x match {
case 0 => Some(" aa ")
case 1 => Some(" bb ")
case 2 => Some(" cc ")
case _ => Some(" not identified ")
}
}
}
产生结果:
called for :0
called for :1
called for :2
called for :2
Some( aa cc cc )
脱糖代码
def forWithIf(condition: Boolean) = {
val x = name(0).flatMap(((a) => if (condition)
{
name(1);
name(2)
}
else
name(100).flatMap(((b) => name(2).map(((c) => a.$plus(b).$plus(c)))))));
println(x)
};
产生结果:
called for :0
called for :1
called for :2
Some( cc )
【问题讨论】:
-
什么是
name?诊断"called for"放在哪里? -
@jwvh 不好意思,第一次忘记加了,刚刚编辑加了。
标签: scala for-comprehension scalac