1

我正在尝试使用 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
   }
}

作为折衷方案,我可以更改 trait 的语义,使其calculate成为返回 a 的无参数方法Function1,而不是采用Input参数并返回 a 的方法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
   }
}

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

4

2 回答 2

4

你只需要修正你的语法,它就可以工作:

def calculate(s: String) = s match {
  case "one" => 1
  case "two" => 2
  case s: String => 0
}
于 2013-06-13T20:39:37.063 回答
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
   }
}
于 2013-06-14T18:25:30.653 回答