println(f(a))是什么意思?

时间:2017-10-10 10:08:14

标签: scala

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  
    }  
}  

1 个答案:

答案 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版本有助于更好地理解。