2013-05-03 2 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) 
} 

Мне интересно, если это возможно реализовать greet с частичным применением метода hello? Что-то вроде:

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

(Очевидно, что это не работает)

ответ

2

Хотя можно, конечно, реализовать 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 _ 
} 

Как и в сторону, вы можете также определить greet с явным приведением типа ДЕЦЛ без знака подчеркивания :

def greet: String=> String = hello 
+1

Таким образом, это невозможно сделать, если только s более высокий класс уже определил метод как String => String, а не (name: String) String. Интересно, что 'def greet (name: String) = hello (name)' и 'def greet = hello _' не совпадают, несмотря на то, что они имеют одинаковое имя и эффективный тип String => String и что можно определить как в тот же класс. Haskell 1, Scala 0.;) –

2

В Scala часто приходится явно указать, когда вы хотите применить метод только частично. Это делается путем написания подчеркивания за именем метода (но не забывайте пробел перед этим). В вашем случае она будет работать следующим образом:

def greet = hello _ 

EDIT: После того, что наблюдается @Richard Sitze, вы могли бы изменить ситуацию, немного изменив определение Foo следующим образом:

trait Foo { 
    def greet : String => String 
} 

: будь то это, конечно, зависит от конкретной настройки.

Смежные вопросы