使用部分函数实现scala方法

时间:2013-05-03 23:55:05

标签: scala partialfunction

我有一节课,如下:

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
}

(显然这不起作用)

2 个答案:

答案 0 :(得分:2)

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

def greet = hello _

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

trait Foo {
  def greet : String => String
}

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

答案 1 :(得分:2)

虽然如@chris所述,您确实可以实现greet,但代码段重载 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  _
}

另外,您还可以使用显式类型decl定义greet,而不使用尾随下划线:

def greet: String=> String = hello