我可以使用case语句从trait实现一个方法吗?

时间:2013-06-13 20:32:21

标签: scala scala-2.10

我正在尝试使用case语句实现一个方法,但以下代码无法编译。

我知道我可以通过使用模式匹配来实现这一点,但我很好奇为什么case语句与直接实现不兼容....

trait Calculation[Input, Result] {
   def calculate(in: Input): Result
}

class CalculationImpl : Calculation[String, int] {
   // missing parameter type for expanded function
   // The argument types of an anonymous function must be fully known. (SLS 8.5)
   def calculate = {
      case "one" => 1
      case "two" => 2
      case s: String => 0
   }
}

作为妥协,我可以更改特征的语义,以便calculate成为无参数的方法,返回Function1,而不是采用Input参数并返回的方法一个Result。但是,这并不理想......

trait Calculation[Input, Result] {
   def calculate: Input => Result // Works, but semantics have changed.
}

class CalculationImpl : Calculation[String, int] {
   def calculate = {
      case "one" => 1
      case "two" => 2
      case s: String => 0
   }
}

(注意:以上是伪代码 - 我还没有尝试编译这个确切的代码)

2 个答案:

答案 0 :(得分:4)

您只需要修复语法,它就会起作用:

def calculate(s: String) = s match {
  case "one" => 1
  case "two" => 2
  case s: String => 0
}

答案 1 :(得分:1)

您可以更接近原始语义,并通过将calculate定义为函数值来切断样板:

trait Calculation[Input, Result] {
   type F = Input => Result
   val calculate: F
}

class CalculationImpl extends Calculation[String, Int] {
   val calculate: F = {
      case "one" => 1
      case "two" => 2
      case s: String => 0
   }
}