2015-06-23 27 views
1

Odersky精心優化了Java語法,支持無圓點和圓括號的對象調用。即而不是list.prepend(item),現在您只需編寫list :: item,這也將語言運算符轉換爲簡單的對象方法。這裏,List定義了::(前置)運算符。但是,您通常在Scala中使用item :: list將它寫成副詞。它表明每個(可列出的)類型都定義了::(List)運算符,這是令人難以置信的。操作數反轉如何實現?我無法從源代碼中找到它Scala中的操作數順序List.prepend(::)

class List[+A] extends AbstractSeq[A] 
    def ::[B >: A] (x: B): List[B] = 
    new scala.collection.immutable.::(x, this) 

看起來::(val頭,val尾)也代表一個類型名稱。但它無論如何不適合head :: tail模式。

+0

'::'是Scala的「cons」,非空列表和對應於'Nil'。請注意,您也可以使用中綴表示法來表示二進制類型的構造函數 - 將泛型類型視爲產生結果類型的「類型函數」:'type \/[+ A,+ B] =或者[A,B]'then 'def foo:String \/Int = ???'。 –

回答

4

任何運營商右側的:都會翻轉其操作數。還有其他一些運營商也利用這一點(儘管我的頭頂上沒有任何示例)。

+1

有了您的信息,我找到了[類似的問題/答案](http://stackoverflow.com/a/2827570/4550451)。謝謝。 – Val

+0

@RecognizeEvilasWaste Np。思考Scala很好。我想念它 :/ – Carcigenicate