1

我有一堂课,如下:

trait Foo {
  def greet(name: String) : String
}

trait Bar {
  def hello(name: String) = s"Hello ${name}!"
}

class Greeter extends Foo with Bar {
  def greet(name: String) = hello(name)
}

我很好奇是否可以greet使用该方法的部分应用来实现hello?就像是:

class Greeter extends Foo with Bar {
  def greet = hello
}

(显然这不起作用)

4

2 回答 2

2

在 Scala 中,您通常必须明确声明何时只想部分应用方法。这是通过在方法名称后面写下划线来完成的(但不要忘记之前的空格)。在您的情况下,它将按如下方式工作:

def greet = hello _

编辑:在@Richard Sitze 观察到之后,您可以通过稍微更改以下定义来修改情况Foo

trait Foo {
  def greet : String => String
}

这是否合适当然取决于您的具体设置。

于 2013-05-04T01:32:43.960 回答
2

greet正如@chris 所指出的那样,您当然可以实现该代码片段重载 Foo.greet(name:String);它不会覆盖它:

class Greeter extends Foo with Bar {
    def greet = hello _
}

<console>:9: error: class Greeter needs to be abstract, since method
       greet in trait Foo of type (name: String)String is not defined
       class Greeter extends Foo with Bar { def greet = hello _ }

虽然以下编译:

class Greeter extends Foo with Bar {
    def greet(name: String) = hello(name)
    def greet = hello  _
}

顺便说一句,您还可以greet使用显式类型 decl 进行定义,而无需尾随下划线:

def greet: String=> String = hello
于 2013-05-04T01:39:59.143 回答