Scala中特征实现的部分功能

时间:2015-03-31 00:12:05

标签: scala

我有一个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(_, _)
}

2 个答案:

答案 0 :(得分:1)

如果您只希望eatfoo相同,则可以将方法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中阅读有关部分功能的更多信息。