你应该把=
:
private def createDomNode(tag: String, attrs: Map[String , String]): DomNode = {
// ...
}
如果你不会放=
在方法签名和主体之间,则返回类型为Unit
, 所以这:
def m(i: Int) {}
是相同的
def m(i: Int): Unit = {}
对评论的回应:我之前描述的实际上是方法,如果你在里面定义它object
, class
or 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
itself.
关于 Scala 编程参考。我想你正在谈论第 2 章 - 步骤 3(简介)
如你看到的max
function 是在 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
or trait
定义
抱歉,我需要更清楚地了解这一点,并在第二次更新中更详细地描述它。
我查看了 Scala 规范。看来我这么说并不完全正确myInnerFn
是函数的语法糖。但似乎它被称为方法类型。您可以在规格部分找到它3.3.1 方法类型:
http://www.scala-lang.org/docu/files/ScalaReference.pdf http://www.scala-lang.org/docu/files/ScalaReference.pdf
如果您想更深入地了解这一点,希望它能给您一些线索。我认为很容易迷失在术语中。你可以function
在2种情况下。首先我们有
- 函数 - 返回一些值
- 过程 - 不返回任何值(或者在 Scala 上下文中它返回
Unit
)
在第二种情况下:
- 函数 - 可以传递并被视为值的可执行代码段
- 方法 - 属于该类
有时并不清楚它在什么上下文中意味着什么。例如我可以告诉你myMethod
之所以是函数只是因为它有返回值(或者换句话说:myMethod
这不是程序)。我相信书上的情况是一样的。
还有一件事。第 8.1、8.2、8.3 节Scala 编程可以帮助您理解这个术语。如果我的假设是正确的,你的想法是Function
叫做First-class function
书中有介绍(第 8.3 节中有描述)。
希望这可以帮助