2013-06-13 2 views
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 
    } 
} 

В качестве компромисса, я мог бы измените семантику признака так, чтобы 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 
    } 
} 

(примечание: выше псевдокод - я не пробовал компиляции этот точный код)

ответ

4

Вам просто нужно исправить синтаксис, и он будет работать :

def calculate(s: String) = s match { 
    case "one" => 1 
    case "two" => 2 
    case s: String => 0 
} 
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 
    } 
} 
+0

«В качестве компромисса я мог бы изменить семантику признака так, чтобы вычисление стало беспараметрированным методом, который возвращает Function1, а не метод, который принимает параметр ввода и возвращает результат. Однако это не идеально » –

+1

Да, я это видел. Однако это другое предложение. В отличие от определения 'calculate' как метода без параметров (с семантикой, которая оценивает' вычисление', каждый раз может возвращать значение другой функции), мой подход определяет 'calculate' как фиксированное значение функции. Это как можно ближе к исходной семантике метода вычисления с одним аргументом, в то же время избегая дополнительного шаблона. –

 Смежные вопросы

  • Нет связанных вопросов^_^