2010-10-07 23 views

回答

31

這主要是一個約定的問題。按照慣例,帶有空白參數列表的方法評估其副作用。假定沒有參數的方法是無副作用的。這是公約。

+0

那麼,你會怎麼做一個工廠方法?你會寫'def createAccount:Account'或'def createAccount():Account'? – David 2010-10-07 01:53:19

+5

對於完全習慣的Scala,工廠方法通常寫在伴侶對象上,並命名爲「apply」。然後,您可以使用apply:Account(args)的特殊語法創建對象。 – 2010-10-07 03:09:38

+0

無論空參數列表如何,編譯器都會接受重寫定義:http://pastie.org/1204728。在Language Specification中查找字符串「空參數列表」。 – mkneissl 2010-10-07 06:29:54

1

其他的答案是偉大的,但我也認爲這是值得一提的是無PARAM方法能夠很好的訪問一個類領域,比如:

person.name 

由於參數的方法,你可以很容易地編寫攔截方法讀取(或寫)到「姓名」字段不破壞調用代碼,像這樣

def name = { log("Accessing name!"); _name } 

這就是所謂的Uniform Access Principal

+0

這是爲了設置屬性太?? – Ivan 2010-10-16 08:17:34

+0

我的例子是爲了得到,這裏的設置 def name _ =(name:String)= {_name = name} – 2010-10-16 12:08:03

+0

是的,我使用這個。但我想知道,這是否意味着「name_ =」或「name _ =」? – Ivan 2010-10-16 14:27:27

0

我還有一個光提請大會鼓勵空括號的有用性功能的聲明塊(因而後來打給他們的電話)與副作用。

它與調試器

如果在調試器中添加一個手錶,例如process,該手錶會引用關注的調試環境中的布爾值作爲示例,或者作爲變量視圖,或者作爲純副作用自由函數評估,爲以後的故障排除帶來了嚴重的風險。 事實上,只要你改變上下文(改變線程,移動到調用堆棧,到達另一個斷點...),如果調試器保持這種觀察是一種嘗試評估的事情,我發現至少是這種情況IntelliJ IDEA的,或Visual Studio爲其他語言,然後在任何瀏覽範圍將被觸發可能發現的任何其他process功能的副作用...

試想那種令人費解的故障排​​除這可能導致如果你這樣做因爲一些無辜的常規命名,所以沒有想到這個警告。如果慣例被強制執行,在我的示例中,process布爾評估將永遠不會回調到調試器手錶中的process()函數調用;它可能只是允許在你的調試器中明確地訪問()函數把process()放在手錶中,但是很顯然你不直接訪問任何屬性或局部變量,並且回退到其他瀏覽範圍中的其他process()函數,如果也許是不幸的,至少會不那麼令人驚訝。

相關問題