2014-05-20 52 views
3

感謝這thread,我跟着這個link從Akos Krivach的評論。不尋常的使用新的關鍵字

解決方案中的代碼如下:

implicit def enhanceWithContainsDuplicates[T](s:List[T]) = new { 
    def containsDuplicates = (s.distinct.size != s.size) 
} 

assert(List(1,2,2,3).containsDuplicates) 
assert(!List("a","b","c").containsDuplicates) 

我從來沒有見過,在這種情況下使用new關鍵字。

任何人都可以啓發我如何工作? 這種模式有沒有名字?

乾杯

回答

6

它所謂匿名類在這種情況下,延伸AnyRef(又名對象)。當您需要滾動某個您不想聲明的類的實例時,將使用匿名類。編譯器爲您生成亂碼類名稱:

val x = new { def foo = println("foo") } 
x: AnyRef{def foo: Unit} = [email protected] 

(見,即$anon$1右側)

事實上,你可能已經在Java中看到類似的代碼:

Comparator<Integer> comp = new Comparator<Integer>() { 
    @Override 
    public int compare(Integer integer, Integer integer2) { 
    // ... 
    } 
} 

這個特殊的代碼

implicit def enhanceWithContainsDuplicates[T](s:List[T]) = new { 
    def containsDuplicates = (s.distinct.size != s.size) 
} 

定義方法(將隱式應用),即當c實例化包裝類或多或少等於以下內容:

class Wrapper(private val s: List[T]) { 
    def containsDuplicates = (s.distinct.size != s.size) 
} 
+0

是否新'... {...}與新AnyRef {...}'相同? – rightfold

+0

@rightfold是的,它是 –