2011-06-15 79 views
21

我想在scala单例类中定义一个私有方法,看起来像;如何在Scala中定义一个返回类型的方法?

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

} 

DomNode是Java类型,不是scala类型。 attrs是scala映射的键和值都是String类型。

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

谢谢简单天使的答案。仍然有些混乱。据斯卡拉本书由语言的发明者写程序,下面是一个函数:

def max(x: Int, y: Int): Int = { 
    if (x > y) x 
    else y 
} 

但你的回答说,这是方法,而不是功能。你能解释一下吗?

什么是REPL?

+0

REPL表示'read-eval-print loop',一个交互式shell。你可以通过运行'scala'命令行程序启动Scala REPL。 – kassens 2011-06-15 23:07:57

+0

这可能有助于方法与功能混淆:http://stackoverflow.com/questions/3926047/debunking-scala-myths/4812176#4812176。 – 2011-06-16 01:21:16

+0

不要将问题混合在一起,这只是随机连接(REPL,函数/方法,第一个问题)。 – 2011-06-16 13:35:32

回答

42

你应该只把=

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


关于斯卡拉参考编程。我想你是在谈论第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定义定义它

对不起,我需要更多这方面的明确和描述它更我的第二次更新中的细节。


我看着斯卡拉规格。当我说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节中有描述)。

希望这会有帮助

+0

但是,将一个平等的意志改变成一个scala函数而不是scala方法。 – ace 2011-06-15 18:18:57

+0

我想方法而不是功能。 – ace 2011-06-15 18:19:20

+3

@amc:添加等号*不会将其更改为scala函数。如果你完成'val createDomNode =(...)=>'的事情,那么你会得到一个函数。 – 2011-06-15 18:26:26

相关问题