2011-06-15 74 views
21

我想在scala單例類中定義一個私有方法,看起來像;如何在Scala中定義一個返回類型的方法?

private def createDomNode(tag: String, attrs: Map[String , String]): DomNode { 

} 

DomNode是Java類型,不是scala類型。 attrs是scala映射的鍵和值都是String類型。

但上面給出錯誤。什麼是正確的格式?

謝謝簡單天使的答案。仍然有些混亂。據斯卡拉本書由語言的發明者寫程序,下面是一個函數:

def max(x: Int, y: Int): Int = { 
    if (x > y) x 
    else y 
} 

但你的回答說,這是方法,而不是功能。你能解釋一下嗎?

什麼是REPL?

+0

REPL表示'read-eval-print loop',一個交互式shell。你可以通過運行'scala'命令行程序啓動Scala REPL。 – kassens 2011-06-15 23:07:57

+0

這可能有助於方法與功能混淆:http://stackoverflow.com/questions/3926047/debunking-scala-myths/4812176#4812176。 – 2011-06-16 01:21:16

+0

不要將問題混合在一起,這只是隨機連接(REPL,函數/方法,第一個問題)。 – 2011-06-16 13:35:32

回答

42

你應該只把=

private def createDomNode(tag: String, attrs: Map[String , String]): DomNode = { 
    // ... 
} 

如果你不會把=方法簽名和身體之間,則返回類型爲Unit,所以這樣的:

def m(i: Int) {} 

相同

def m(i: Int): Unit = {} 

迴應評論:我剛纔描述的實際上是方法,如果您在objectclasstrait定義定義它。函數的語法是這樣的:

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發生。和那是因爲我在開頭寫道方式:

如果您在objectclasstrait定義定義它

對不起,我需要更多這方面的明確和描述它更我的第二次更新中的細節。


我看着斯卡拉規格。當我說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節中有描述)。

希望這會有幫助

+0

但是,將一個平等的意志改變成一個scala函數而不是scala方法。 – ace 2011-06-15 18:18:57

+0

我想方法而不是功能。 – ace 2011-06-15 18:19:20

+3

@amc:添加等號*不會將其更改爲scala函數。如果你完成'val createDomNode =(...)=>'的事情,那麼你會得到一個函數。 – 2011-06-15 18:26:26

相關問題