2015-03-31 54 views
1

我有一個Trait及其實現,其中我想以簡明的方式重用現有函數。這裏是例子:在Scala中實現特徵的部分功能

object Util { 
    def foo(a: Int, b:Int): Int = {// some implementation} 
} 
trait Animal { 
    def eat(a: Int, b: Int): Int 
} 
object Dog extends Animal { 
    import Util._ 
    def eat(a: Int, b:Int): Int = foo(a, b) 
    /* Is this any concise way for the above? 
    * For example, I am looking for something 
    * like this to work: 
    */ 
    // def eat = foo 
    // def eat = foo(_, _) 
    // val eat = foo(_, _) 
} 

回答

1

如果您只是想eat是一樣foo,你可以列出的方法foo到一個函數,並將其分配給eat

def foo(a: Int, b: Int): Int = ??? 
val eat = foo _ 

但是這是不可能實現從像Animal一個性狀的方法時,使用這種方法。你必須明確地Dog定義eat的參數,它留給你:

def eat(a: Int, b: Int): Int = ??? 

我想不出什麼比foo(a, b)更簡潔明瞭。

1

可以使用ETA-擴大爲這樣:

val eat = foo _ 
val eat = foo(_, _) //equivalent 

你可以閱讀更多關於ETA-擴大對this blog post。這樣,eat將有類型(Int, Int) => Int。你也可以這樣做:

val eat = (foo _).curried 

要獲得使eat有型Int => (Int => Int)。你可以閱讀更多關於curriedhere

您還應該注意,您使用短語「部分功能」並不是它通常使用的方式。 Scala中的部分函數(通常)是不一定在整個域中定義的函數。例如,在斯卡拉:

val foo: PartialFunction[Int, String] = { case 1 => "hello"; case 2 => "world" } 
foo(1) //"hello" 
foo.isDefinedAt(3) //false 
foo(3) // exception 

您可以在文檔here閱讀更多關於部分功能。