你應該只把=
:
private def createDomNode(tag: String, attrs: Map[String , String]): DomNode = {
// ...
}
如果你不會把=
方法簽名和身體之間,則返回類型爲Unit
,所以這樣的:
def m(i: Int) {}
相同
def m(i: Int): Unit = {}
迴應評論:我剛纔描述的實際上是方法,如果您在object
,class
或trait
定義定義它。函數的語法是這樣的:
val createDomNode: (String, Map[String , String]) => DomNode = { (tag, attrs) =>
// ...
}
,你可以看到我定義val
與功能型的名稱createDomNode
。它也可以寫成:
val createDomNode: Function2[String, Map[String , String], DomNode] = { (tag, attrs) =>
// ...
}
這裏是另一個例子。在這種情況下,我定義的方法生成新的函數每次調用時間:
def createDomNode = (tag: String, attrs: Map[String , String]) => new DomNode
但要明白這一點很重要,該方法返回一個「函數,返回DomNode
」在這種情況下,但不是DomNode
本身。
關於斯卡拉參考編程。我想你是在談論第2步 - 第3步(在介紹中)
正如你可以看到max
函數是在REPL中定義的,它的確是函數。其實你也可以寫這樣的事:
class MyClass {
def myMethod(i: Int): Int = {
def myInnerFn(x: Int) = x * x
myInnerFn(i)
}
}
在這種情況下myMethod
是方法和myInnerFn
是功能。正如你所看到的,它高度依賴於上下文。我相信這句法myInnerFn
只是語法糖(我需要的規格看,以便肯定地說):
val myInnerFn = (x: Int) => x * x
同樣在REPL發生。和那是因爲我在開頭寫道方式:
如果您在object
,class
或trait
定義定義它
對不起,我需要更多這方面的明確和描述它更我的第二次更新中的細節。
我看着斯卡拉規格。當我說myInnerFn
是函數的語法糖時,似乎我並不完全正確。但似乎它被稱爲方法類型。您可以在規範第3.3.1 方法類型找到它:
http://www.scala-lang.org/docu/files/ScalaReference.pdf
希望這會給你一些線索,如果你想潛水在這個更深。我認爲很容易迷失在術語中。您可以在兩種情況下使用function
。在第一,我們有
- 功能 - 返回一定的價值
- 過程 - 沒有返回值(或在斯卡拉情況下它返回
Unit
)
而在第二個方面:
- 功能 - 可執行的代碼片段,可作爲值傳遞並視爲值
- 方法 - 屬於類別
而且它有時不清楚它的含義。例如,我可以告訴你,myMethod
只是因爲它具有返回值(或換句話說:myMethod
它不是過程)。我相信書中的情況也是如此。
還有一件事。來自的第8.1,8.2,8.3節Scala編程可以幫助您理解這個術語。如果我的假設是正確的,你認爲Function
在書中被稱爲First-class function
(在8.3節中有描述)。
希望這會有幫助
REPL表示'read-eval-print loop',一個交互式shell。你可以通過運行'scala'命令行程序啓動Scala REPL。 – kassens 2011-06-15 23:07:57
這可能有助於方法與功能混淆:http://stackoverflow.com/questions/3926047/debunking-scala-myths/4812176#4812176。 – 2011-06-16 01:21:16
不要將問題混合在一起,這只是隨機連接(REPL,函數/方法,第一個問題)。 – 2011-06-16 13:35:32