我有一个Trait及其实现,我希望在其中以简洁的方式重用现有函数。这是一个例子:
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(_, _)
}
答案 0 :(得分:1)
如果您只希望eat
与foo
相同,则可以将方法foo
列入函数,并将其分配给{{ 1}}。
eat
但是从def foo(a: Int, b: Int): Int = ???
val eat = foo _
这样的特征实现方法时,不可能使用这种方法。您必须在Animal
中明确定义eat
的参数,这样您就可以了:
Dog
我无法想到比def eat(a: Int, b: Int): Int = ???
更简洁明了的内容。
答案 1 :(得分:1)
你可以这样使用eta-expansion:
val eat = foo _
val eat = foo(_, _) //equivalent
您可以在this blog post上阅读有关eta-expansion的更多信息。这样,eat
将具有类型(Int, Int) => Int
。你也可以这样做:
val eat = (foo _).curried
要让make eat
具有Int => (Int => Int)
类型。您可以详细了解curried
here。
您还应该注意,您使用短语“部分功能”并不是通常使用的方式。 Scala中的部分函数(通常)是不一定在整个域上定义的函数。例如,在Scala中:
val foo: PartialFunction[Int, String] = { case 1 => "hello"; case 2 => "world" }
foo(1) //"hello"
foo.isDefinedAt(3) //false
foo(3) // exception
您可以在文档here中阅读有关部分功能的更多信息。