我想在scala单例类中定义一个类似于;
的私有方法private def createDomNode(tag: String, attrs: Map[String , String]): DomNode {
}
DomNode是Java类型,而不是scala类型。 attrs是scala Map,键和值都是String类型。
但上面给出了错误。什么是正确的格式?
感谢Easy Angel的答案。仍有一些困惑。根据该语言的发明者编写的Scala编程书,下面是一个函数:
def max(x: Int, y: Int): Int = {
if (x > y) x
else y
}
但是你的答案说它是方法而不是功能。你能解释一下吗?
什么是REPL?
答案 0 :(得分:46)
你应该放=
:
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
本身。
关于Scala参考中的编程。我想你在谈论第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
定义中定义
对不起,我需要更加清楚这一点,并在第二次更新中更详细地描述它。
我查看了Scala规范。当我说myInnerFn
是函数的语法糖时,我似乎并不完全正确。但似乎它被称为方法类型。您可以在规格部分 3.3.1方法类型:
http://www.scala-lang.org/docu/files/ScalaReference.pdf
希望它能给你一些线索,如果你想深入了解这一点。我认为很容易迷失在术语中。您可以在2个上下文中function
。首先我们有
Unit
)在第二种情况下:
有时候不清楚它的含义是什么。例如,我可以告诉你,myMethod
只是因为它具有返回值(或者换句话说: myMethod
它不是过程)。我相信书中也是如此。
还有一件事。来自 Scala编程的第8.1,8.2,8.3节可以帮助您理解这个术语。如果我在我的假设中是正确的,那么您认为Function
在本书中称为First-class function
(在8.3节中描述)。
希望这有帮助