2010-06-22 43 views

回答

17

我不確定在Lift中使用_!_!!的約定是什麼,但這裏有一些背景知識。

任何字母數字標識符都可以包含_和添加的符號列表,並且仍然可以將其解析爲單個標識符。例如:

scala> class [email protected]%*! 
defined class Example_$bang$at$percent$times$bang 

(事實上,你可以,如果你使用反引號括起來解析幾乎任何東西作爲標識符 - 這是你做什麼,如果一個Java類使用Scala的保留字,例如或者如果你想在你的標識符中有空格。)

然而編譯器只識別一個符號結尾。如果有一種方法看起來像一個getter,那麼getter_ =將被解釋爲一個setter。 (不管你實際使用它作爲一個二傳手是由你;它會有一個二傳手的語義,反正),所以

scala> class Q { def q = "Hi"; def q_=(s: String) { println(s.reverse) } } 
defined class Q 

scala> val q = new Q 
q: Q = [email protected] 

scala> q.q 
res0: java.lang.String = Hi 

scala> q.q = "Could use this to set something" 
gnihtemos tes ot siht esu dluoC 

此外,編譯器反轉主叫方和被叫方的順序任何方法結束於:。這在列表中最常見:newElement :: existingList實際上是對existingList.::(newElement)的調用。因此,例如:

scala> object Caps { def to_:(s: String) = s.toUpperCase } 
defined module Caps 

scala> "Example" to_: Caps 
res40: java.lang.String = EXAMPLE 

_ +符號的任何其他用法都是約定。

+0

哇。偉大的講座。我幾乎不知道這一點。謝謝! – aioobe 2010-06-22 21:12:05

+3

'_'用於將單詞字符組與符號字符分開。所以'foo _ !! _ bar'是一個合法的標識符。如果你不想遵循這個規則,或者需要使用保留字,你也可以用反引號括起來。例如,這對於調用名爲'type'的java方法很有用。 – retronym 2010-06-22 21:16:40

+2

@retronym - 反引號的好點;我會補充一點。嘗試在REPL中輸入'val foo _ !! _ bar = 0',雖然.... – 2010-06-22 21:24:37

8

這裏沒有特別的意義!在斯卡拉的名字。在基於Lisp的語言家族中,!通常用於表示函數具有副作用,並且這看起來是這裏的慣例。

+2

另一個類似的約定是用於使用零參數列表作爲副作用自由函數,併爲其他函數使用一個空參數列表。例如'gun.model' vs'gun.fire()' – retronym 2010-06-22 21:19:02

+2

Ruby對*副作用使用'!'也 – OscarRyz 2010-06-22 21:48:33

6

到目前爲止,奇怪地未提及的(儘管與你的問題沒有特別的關係)是一元的!這是專門處理。

scala> class A { def unary_! = 5 } 
defined class A 

scala> !(new A) 
res0: Int = 5 
+2

它跟unary_有更多的關係,那麼最後你可以有unary_ +例如 – 2013-02-13 13:49:24

相關問題