我正在尝试使用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
}
}
(注意:以上是伪代码 - 我还没有尝试编译这个确切的代码)
答案 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
}
}