object MainObject {
def main(args: Array[String]) = {
functionExample(25, multiplyBy2) // Passing a function as parameter
}
def functionExample(a:Int, f:Int=>AnyVal):Unit = {
println(f(a)) // Calling that function
}
def multiplyBy2(a:Int):Int = {
a*2
}
}
答案 0 :(得分:1)
如果您将此行添加到build.sbt:
scalacOptions += "-Xprint:jvm"
然后在编译时会生成以下这个代码的desugared版本:
[[syntax trees at end of jvm]] // Test.scala
package <empty> {
object MainObject extends Object {
def main(args: Array[String]): Unit = MainObject.this.functionExample(25, {
{
$anonfun()
}
});
def functionExample(a: Int, f: Function1): Unit = scala.Predef.println(f.apply(scala.Int.box(a)));
def multiplyBy2(a: Int): Int = a.*(2);
final <static> <artifact> def $anonfun$main$1(a: Int): Int = MainObject.multiplyBy2(a);
def <init>(): MainObject.type = {
MainObject.super.<init>();
()
}
}
}
正如您所看到的,f(a)
实际上是f.apply(scala.Int.box(a))
。因此,执行apply
类型实例的函数f
的{{1}}方法。然后打印结果。
之前对你的问题的评论已经提到过,但我认为代码的desugared版本有助于更好地理解。