2012-01-10 24 views
7

我要通過行動一本書提起,我遇到了一些我不太明白:_ ::在Scala中_ ::是什麼意思?

object permanent_link extends MappedString(this, 150){ 
    override def validations = 
    valMinLen(3, "Link URL must be at least 5 characters") _ :: 
    super.validations 
} 

我無法找到任何暗示,所以我將不勝感激,如果有人可以幫助我出..

回答

18

我不知道電梯,但這是一個普遍的問題。首先,在::是Scala的缺點運營商:

scala> 1 :: 2 :: List(3, 4) 
res0: List[Int] = List(1, 2, 3, 4) 

這意味着super.validations是某種序列和valMinLen(3, "Link URL must be at least 5 characters") _是在該列表中的一個值。

從它看起來很明顯,在重寫validations方法,他們都呼籲super版本上下文之初前面加上一些額外的驗證。

這個額外的驗證是通過致電valMinLen()創建的。然而,這個額外的調用不會返回一個匹配validations列表類型的元素 - 而是一個函數。我們明確表示(不包括前置函數值)(通過添加_後綴),我們希望自己添加一個函數,而不是該函數的返回值。

代碼段是勝過千言萬語:

scala> def f = 3 
f: Int 

scala> def g = 4 
g: Int 

scala> val listOfInts = List(f, g) 
listOfInts: List[Int] = List(3, 4) 

scala> val listOfFunctions = List(f _, g _) 
listOfFunctions: List[() => Int] = List(<function0>, <function0>) 

比較的listOfIntslistOfFunctions類型。我相信f _語法在Scala世界中被稱爲部分應用函數

5

下劃線指示valMinLen不會被調用,而是用作函數「指針」。

::運算符連接列表。

它將換句話說看起來像代碼生成一個列表validations是由一個函數「指針」 valMinLen與參數給出的列表的其餘部分是super.validations的價值,那就是超級類驗證。

我敢肯定有人會糾正我在這裏的術語:)

0

的代碼可能與一些適當的縮進更具可讀性和引入VAL:

object permanent_link extends MappedString(this, 150) { 

    override def validations = minimumValidation :: super.validations 

    val minimumValidation = valMinLen(3,"Link URL must be at least 5 characters") _ 
} 

所以如前所述,在::操作只是前添加一個新元素到列表中,_無關與它被用來獲取一個函數對象,就像在

(1 :: 2 :: Nil) map (println _) 

,其中列表[1,2]並將函數println應用於每個元素(下劃線實際上可以省略)。對象println _println方法構造函數對象,_表示函數的單個參數。

+0

所以你可以在聲明它之前引用'minimumValidation'? – ziggystar 2012-01-11 11:07:38

+0

聲明順序在scala中無關緊要,它不適用於大多數當前的語言。 – Ramses 2012-01-12 11:48:38