如何在Scala中定义一个返回类型的方法?

时间:2011-06-15 18:15:32

标签: scala

我想在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?

1 个答案:

答案 0 :(得分:46)

你应该放=

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本身。


关于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中也是如此。顺便说一句,因为我在开头写道:

  

如果您在objectclasstrait定义中定义

对不起,我需要更加清楚这一点,并在第二次更新中更详细地描述它。


我查看了Scala规范。当我说myInnerFn是函数的语法糖时,我似乎并不完全正确。但似乎它被称为方法类型。您可以在规格部分 3.3.1方法类型

中找到它

http://www.scala-lang.org/docu/files/ScalaReference.pdf

希望它能给你一些线索,如果你想深入了解这一点。我认为很容易迷失在术语中。您可以在2个上下文中function。首先我们有

  • 功能 - 返回一些值
  • 过程 - 不返回任何值(或在Scala上下文中返回Unit

在第二种情况下:

  • 功能 - 可以传递并作为值处理的可执行代码
  • 方法 - 属于班级

有时候不清楚它的含义是什么。例如,我可以告诉你,myMethod只是因为它具有返回值(或者换句话说: myMethod它不是过程)。我相信书中也是如此。


还有一件事。来自 Scala编程的第8.1,8.2,8.3节可以帮助您理解这个术语。如果我在我的假设中是正确的,那么您认为Function在本书中称为First-class function(在8.3节中描述)。

希望这有帮助