你应该只把=
:
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