2017-10-10 219 views
0
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 
    } 
} 
+3

它打印使用参数a调用函数f的结果。 f是一个作为参数传递的函数指针,在你的情况下它指向'multiplyBy2' – neuhaus

回答

1

如果添加此行build.sbt:

scalacOptions += "-Xprint:jvm"

然后在编译时会产生这个代码的下面脱糖版本:

[[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))。所以类型的实例函数fapply方法被执行。之后你打印结果。

它已在前面的评论中提到您的问题,但我认为代码的desugared版本有助于更好地理解。