【问题标题】:How to define a method in Scala that returns a Java object?如何在 Scala 中定义返回 Java 对象的方法?
【发布时间】:2011-06-15 18:15:32
【问题描述】:

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

【问题讨论】:

  • REPL 表示“读取-评估-打印循环”,一个交互式外壳。您可以通过运行scala 命令行程序来启动 Scala REPL。
  • 这可能有助于解决方法与函数的混淆:stackoverflow.com/questions/3926047/debunking-scala-myths/…
  • 不要把问题混在一起,它们只是随机连接的(REPL,函数/方法,第一个问题)。
  • 请停止向这个问题添加更多问题。如果答案将您引向新问题,请随时提出新问题。谢谢。
  • @ace 不要在问题本身中留下对答案的回复,您应该使用@ 发表评论,后跟您要回复的用户名。这将通知用户您正在写给他们的消息。

标签: scala


【解决方案1】:

你应该把=:

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) =>
    // ...
}

如您所见,我用函数类型的名称 createDomNode 定义了 val。也可以这样写:

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

希望它能给你一些线索,如果你想深入研究的话。我认为很容易迷失在术语中。您可以在两种情况下function。首先我们有

  • 函数 - 返回一些值
  • 过程 - 不返回值(或在 Scala 上下文中返回 Unit

在第二种情况下:

  • 函数 - 可执行的代码段,可以传递并视为值
  • 方法 - 属于类

而且有时不清楚它在什么背景下意味着什么。例如,我可以告诉你 myMethod 是函数,只是因为它有返回值(或者换句话说:myMethod 它不是过程)。我相信书中的情况也是如此。


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

希望对你有帮助

【讨论】:

  • 但是放置一个等于会将它变成一个scala函数而不是scala方法。
  • 我想要方法而不是功能。
  • @amc:添加等号不会将其更改为 Scala 函数。如果你做了整个val createDomNode = ( ... ) => 的事情,那么你就会得到一个函数。
  • 等号只是表明该方法正在返回一些东西(即除了 Unit 之外的东西)。有关详细信息,请参阅此问题/答案:stackoverflow.com/questions/944111/…
  • 是的,这是正确的例子是第 2 章第 3 页第 72 页。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-01
  • 2010-10-02
  • 2016-09-02
  • 1970-01-01
  • 2019-11-12
  • 2017-07-31
相关资源
最近更新 更多