2013-05-03 70 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定義如下修改情況這當然取決於你的具體設置。