2014-02-03 3 views
0

Как я могу сделать этот сегмент кода более эффективным?Scala redundant pattern matching

v match { 
    case y @ A(x) => 
    val x = if (mapping.contains(y)) 
     mapping.get(y) 
    else 
     v 
    x match { 
     case y @ A(i) => 
     lookup(y) 
    } 
} 

Я чувствую, что использование двух шаблонов matchers может получить сводятся к одному объявляя Вэл для получения mapping.get (у), но каждый раз, когда я пытаюсь сделать это я получаю незаконное начало простого выражения ошибка:

v match { 
    case y @ A(x) => 
    val x = if (mapping.contains(y)) 
     val x = mapping.get(y) //Causes an error 
     lookup(x) 
    else 
     v 
} 

ответ

3

Я предполагаю, что mapping является Map? Если да, то используйте getOrElse:

val x = mapping.getOrElse(y, v) 

В вашем втором блоке кода, вам нужно иметь фигурные скобки вокруг двух операторов внутри if.

Но ваш код не имеет большого смысла. Несколько причин:

  • Вы case y @ A(x), который присваивает значение x. Но затем, сразу после этого, у вас есть x=, что означает, что вы назначаете новый x, затеняя старый.
  • Аналогичным образом у вас есть case y @ A(i), но вы не используете i.
  • Ни у match заявление имеет более одного case. Это приведет к ошибке времени выполнения, если совпадение не выполняется. Но если вы знаете, что это не подведет, то матч не очень полезен.
2

Рассмотрим

mapping.getOrElse(y,v) match { 
    case z @ A(i) => lookup(z) 
    case _  => somethingElse 
} 
+0

Обратите внимание @dhg «s поучительные замечания по осведомился код. – elm