Scala 相較於Java多了hight-order function的能力, 就好比把function 當作參數傳到其他method, 但Scala終究還是run在jvm, 那麼就是eta-expansion 黑魔法
Scala List 是一個功能強大的class
裡面有很多method 可以接受high-order function 當作參數
比如map , 把List中的每一個element轉換成另一個東西
這個轉換過程就是你定義的function, 然後傳入
def inc(x: Int) = x + 1
List(1, 2) map inc //returns List(2, 3)
這裏就是把function inc當作參數傳入map method中
可是jvm 是不可能接受function型態的參數
因此Scala compiler 黑魔法 Eta-expansion
就是專門在做這層轉換
把你傳入的function 用一層Function 物件包裝起來
使其真正傳入還是一個物件而非function
然後包裝的Function物件的apply method去呼叫真正的 inc function
List(1,2) map new Function1[Int, Int] {
def apply(x: Int) = inc(x)
}
private def inc(x: Int) = x + 1
以上
更詳盡的 eta expansion knowledge 參考自
http://www.nurkiewicz.com/2012/04/eta-expansion-internals-in-scala.html
沒有留言:
張貼留言