2011-05-01 27 views
9

如果我創建了一個功能:DEF與無參數

def a(): String = return "some string" 

的結果將是「一個:()字符串」 所以我可以用/使用它,而括號

在另一方面,如果我創建了相同的功能

def a:String = return "some other string" 

這將是隻是「:字符串」 在這種情況下,我不能用括號使用它。

這兩者有什麼區別?

+4

注意:您可以省略'return'關鍵字 - 在Scala中,方法的結果是方法中最後一個表達式的值。 – Jesper 2011-05-01 20:33:36

+0

您也可以避免指定def類型。我只想指出這是一種功能,所以每個人都會馬上看到=) – Konstantin 2011-05-01 20:37:43

+3

但它不是一種功能 - 它是一種方法。 :)我通過關鍵字'def'得到這個,不是嗎?由於大部分時間,'return'被遺漏。 – 2011-05-02 04:30:14

回答

10

良好做法建議確定有沒有副作用的功能沒有(),並在定義網站和呼叫網站添加()兩個當功能有副作用時(例如,println()而不是println)。

6

如果定義a這樣的,不帶括號(注意,該return關鍵字是沒有必要的):

def a: String = "some other string" 

,然後用括號把它叫做:a(),那麼()不是空的參數列表方法a;相反,Scala會嘗試將()應用於方法a返回的字符串。當你嘗試提示到你得到的錯誤消息:

scala> a() 
<console>:7: error: not enough arguments for method apply: (n: Int)Char in trait StringLike. 
Unspecified value parameter n. 
     a() 
     ^

所以,在第二種情況下,a()意味着什麼比在第一種情況下別人。在第一種情況下,它僅僅意味着「使用空參數列表呼叫a」,並且在第二種情況下意味着「呼叫a,然後將()應用於該方法的結果」,其將在String上失敗。

編輯要在下面的評論中擴展您的第二個問題,這取決於您的意思是「同一件事」。正如您在REPL中看到的,它看起來像是()java.lang.String,而另一個類型是java.lang.String。看看下面,其中xy轉成同一件事:

scala> def a() = "aaa" 
a:()java.lang.String 

scala> def b = "bbb" 
b: java.lang.String 

scala> val x = a _ 
x:() => java.lang.String = <function0> 

scala> val y = b _ 
y:() => java.lang.String = <function0> 
+0

你也可以縮小這個方法來def a =「some string」。我可能應該改述我的問題。如果我不嘗試用括號來調用第二個函數,那麼這兩個變體是相同的東西? – Konstantin 2011-05-01 20:56:18

+0

在第74頁的「Programming in Scala,2nd edition」一書中,有一個def沒有參數的例子。它說:「空括號表示該函數不帶參數」(在scala解釋器的結果中爲parenteses)。它們後面跟着def類型。斯卡拉翻譯也說,defs是平等的。我不明白的是爲什麼第二個符號不理解括號內的東西=)這很奇怪 – Konstantin 2011-05-01 21:31:13