如果我創建了一個功能:DEF與無參數
def a(): String = return "some string"
的結果將是「一個:()字符串」 所以我可以用/使用它,而括號
在另一方面,如果我創建了相同的功能
def a:String = return "some other string"
這將是隻是「:字符串」 在這種情況下,我不能用括號使用它。
這兩者有什麼區別?
如果我創建了一個功能:DEF與無參數
def a(): String = return "some string"
的結果將是「一個:()字符串」 所以我可以用/使用它,而括號
在另一方面,如果我創建了相同的功能
def a:String = return "some other string"
這將是隻是「:字符串」 在這種情況下,我不能用括號使用它。
這兩者有什麼區別?
良好做法建議確定有沒有副作用的功能沒有()
,並在定義網站和呼叫網站添加()
兩個當功能有副作用時(例如,println()
而不是println
)。
如果定義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
。看看下面,其中x
和y
轉成同一件事:
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>
你也可以縮小這個方法來def a =「some string」。我可能應該改述我的問題。如果我不嘗試用括號來調用第二個函數,那麼這兩個變體是相同的東西? – Konstantin 2011-05-01 20:56:18
在第74頁的「Programming in Scala,2nd edition」一書中,有一個def沒有參數的例子。它說:「空括號表示該函數不帶參數」(在scala解釋器的結果中爲parenteses)。它們後面跟着def類型。斯卡拉翻譯也說,defs是平等的。我不明白的是爲什麼第二個符號不理解括號內的東西=)這很奇怪 – Konstantin 2011-05-01 21:31:13
注意:您可以省略'return'關鍵字 - 在Scala中,方法的結果是方法中最後一個表達式的值。 – Jesper 2011-05-01 20:33:36
您也可以避免指定def類型。我只想指出這是一種功能,所以每個人都會馬上看到=) – Konstantin 2011-05-01 20:37:43
但它不是一種功能 - 它是一種方法。 :)我通過關鍵字'def'得到這個,不是嗎?由於大部分時間,'return'被遺漏。 – 2011-05-02 04:30:14