蓝山帝景
正如我在另一个主题中已经说过的那样,scalac -print打印出scala代码,而不是java。它将所有与Java不直接兼容的scala关键字转换为普通的scala代码。让编译器仅翻译部分afaik是不可能的。但基本上,理解力总是以相同的方式翻译。这样的简单/收益for(x <- List(1,2,3)) yield x*x将被翻译成List(1,2,3).map {x => x*x}而且没有产量for(x <- List(1,2,3)) println(x)至List(1,2,3).foreach{x => println(x)}嵌套的fors将转换为嵌套的flatMap / map构造for(x <- List(1,2,3); y <- List(4,5,6)) yield x*y将被翻译成List(1,2,3).flatMap { x => List(4,5,6).map { y => x*y }}所以绝对没有魔术
斯蒂芬大帝
宏呢?import scala.reflect.macros.Contextimport scala.reflect.runtime.universe._import scala.language.experimental.macrosdef _desugar(c : Context)(expr : c.Expr[Any]): c.Expr[Unit] = { import c.universe._ println(show(expr.tree)) reify {}}def desugar(expr : Any) = macro _desugar可以根据您的要求直接在REPL中使用:scala> desugar { for(i <- List(1,2,3,4,5)) yield i }immutable.this.List.apply[Int](1, 2, 3, 4, 5).map[Int, Any](((i: Int) =>i))(immutable.this.List.canBuildFrom[Int])scala> desguar { for(i <- (0 to 10) if (i > 5)) yield i }scala.this.Predef.intWrapper(0).to(10).withFilter(((i: Int) => i.>(5))).map[Int,Any](((i: Int) => i))(immutable.this.IndexedSeq.canBuildFrom[Int])它也适用于其他任意表达式。scala> desugar { | val x = 20 | val y = 10 | println(x + y) | }{ val x: Int = 20; val y: Int = 10; scala.this.Predef.println(x.+(y))}这可能是您最接近所要查询的内容,而不必随时将数据编译或转储到文件中。您可以直接在REPL中定义宏,也可以在通过:load命令加载的外部文件中定义宏。