2013-05-03 71 views
1

我有一个类Scala的方法,如下所示:实现使用部分功能

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) 
} 

我很好奇,如果有可能使用hello方法的部分应用程序来实现greet?喜欢的东西:

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

(显然,这不工作)

回答

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 _ 
} 

顺便说一句,你还可以用一个明确的类型DECL定义greet,但没有尾随下划线:

def greet: String=> String = hello 
+1

所以,总之,这是不可能的,除非s uper类已经将方法定义为String => String,而不是(name:String)String。有趣的是,尽管具有相同的名称和有效类型的String => String,'def greet(name:String)= hello(name)'和'def greet = hello _'并不相同,并且可以同时定义同一班。 Haskell 1,Scala 0.;) – 2013-05-05 18:48:39

2

Scala里你经常有,当你想只是部分适用的方法来明确说明。这是通过在方法名称后面写下一个下划线来完成的(但在此之前不要忘记一个空格)。在你的情况下,将工作方式如下:

def greet = hello _ 

编辑:

trait Foo { 
    def greet : String => String 
} 

是否:以后有什么@Richard Sitze观察,你可以通过稍微改变的Foo定义如下修改情况这当然取决于你的具体设置。