我有一节课,如下:
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
}
(显然这不起作用)
答案 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