2015年3月12日 星期四

Scala knowledge - Eta-expansion

不算前言
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

沒有留言:

張貼留言