2016-09-12 110 views
7

我是斯卡拉新手。我剛剛聽到「eta擴展」一詞,大致知道它意味着將方法擴展到函數對象。但是我在SO中找不到有系統地介紹它的資源。斯卡拉的eta擴展是什麼?

我很好奇eta擴展如何在Scala中工作。 eta擴展需要哪些場景?而如何在Scala中實現eta擴展

我大概知道,在這樣的情況下:

def someMethod(x: Int): Int = x * x 

someMethod _大致會被翻譯成一個新的函數對象是這樣的:

new Function1[Int, Int] { 
    def apply(x: Int): Int = x * x 
} 

是不是所有的Scala呢?

+0

埃塔膨脹的一個非常不錯的(如果日)解釋斯卡拉 - https://gleichmann.wordpress.com/2011/01/09/functional-scala-turning-methods-into-functions/ – Nio

回答

9

該定義和一些示例在http://scala-lang.org/files/archive/spec/2.11/06-expressions.html#method-values中給出。

someMethod _大致會被翻譯成一個新的函數對象是這樣的:

不太:它實際上是

new Function1[Int, Int] { 
    def apply(x: Int): Int = someMethod(x) 
} 

的差異事項如如果someMethod在某處被覆蓋。

這就是Scala所做的一切嗎?

您還需要考慮如果方法採用多個參數列表(您會得到一個函數返回函數)或by-name參數會發生什麼情況。

eta擴展需要哪些場景?

  1. 當你特別要求它(例如someMethod _)。

  2. 當您使用一個函數類型(或Scala 2.12中的SAM類型)的值預期的方法(帶參數)。例如。

    def foo(f: Int => Int) = ??? 
    
    foo(someMethod) 
    
  3. 就是這樣。

注意,使用ETA-擴大與佔位符的匿名函數(someMethod(_))可以表現不同,由於類型推斷,implicits等