Я пытаюсь реализовать метод с использованием оператора 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
}
}
(примечание: выше псевдокод - я не пробовал компиляции этот точный код)
«В качестве компромисса я мог бы изменить семантику признака так, чтобы вычисление стало беспараметрированным методом, который возвращает Function1, а не метод, который принимает параметр ввода и возвращает результат. Однако это не идеально » –
Да, я это видел. Однако это другое предложение. В отличие от определения 'calculate' как метода без параметров (с семантикой, которая оценивает' вычисление', каждый раз может возвращать значение другой функции), мой подход определяет 'calculate' как фиксированное значение функции. Это как можно ближе к исходной семантике метода вычисления с одним аргументом, в то же время избегая дополнительного шаблона. –