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

ace*_*ace 23 scala

我想在scala单例类中定义一个看起来像的私有方法;

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

}
Run Code Online (Sandbox Code Playgroud)

DomNode是Java类型,而不是scala类型.attrs是scala Map,其键和值都是String类型.

但上面给出了错误.什么是正确的格式?

谢谢Easy Angel的答案.仍有一些困惑.根据该语言的发明者编写的Scala编程书,下面是一个函数:

def max(x: Int, y: Int): Int = {
  if (x > y) x
  else y
}
Run Code Online (Sandbox Code Playgroud)

但是你的回答是它是方法而不是功能.你能解释一下吗?

什么是REPL?

ten*_*shi 47

你应该把=:

private def createDomNode(tag: String, attrs: Map[String , String]): DomNode = {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

如果你不介绍=方法签名和正文,那么返回类型是Unit,所以这个:

def m(i: Int) {}
Run Code Online (Sandbox Code Playgroud)

是相同的

def m(i: Int): Unit = {}
Run Code Online (Sandbox Code Playgroud)

回应评论:我刚才描述的实际上是方法,如果您在定义它object,classtrait定义.函数语法如下所示:

val createDomNode: (String, Map[String , String]) => DomNode = { (tag, attrs) =>
    // ...
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我定义valcreateDomNode函数类型的名称.它也可以写成:

val createDomNode: Function2[String, Map[String , String], DomNode] = { (tag, attrs) =>
    // ...
}
Run Code Online (Sandbox Code Playgroud)

这是另一个例子.在这种情况下,我定义了每次调用它时生成新函数的方法:

def createDomNode = (tag: String, attrs: Map[String , String]) => new DomNode
Run Code Online (Sandbox Code Playgroud)

但重要的是要明白,DomNode在这种情况下,该方法返回一个"返回的函数",但不是DomNode它本身.


关于Scala参考中的编程.我想你在谈论第2章 - 第3步(在介绍中)

正如您所看到的,max函数在REPL中定义,它确实起作用.其实你也可以写这样的东西:

class MyClass {
    def myMethod(i: Int): Int = {
        def myInnerFn(x: Int) = x * x

        myInnerFn(i)
    }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下myMethod,方法和myInnerFn功能.如您所见,它在很大程度上取决于上下文.我相信这种语法myInnerFn只是语法糖(我需要查看规范才能确定):

val myInnerFn = (x: Int) => x * x
Run Code Online (Sandbox Code Playgroud)

REPL也是如此.顺便说一句,因为我在开头写道:

如果您在定义它object,classtrait定义

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


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

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节中描述).

希望这可以帮助

  • @amc:添加等号*不会*将其更改为scala函数.如果你做了整个`val createDomNode =(...)=>`的事情,那么你得到一个函数. (3认同)
  • 等号只表示该方法返回一些东西(即Unit以外的东西).有关详细信息,请参阅此问题/答案:http://stackoverflow.com/questions/944111/when-to-use-the-equals-sign-in-a-scala-method-declaration (3认同)