Scala: конвертировать совпадение в соответствие шаблону с анонимной функцией - со значениями

как и аналогичный вопрос: Преобразование утверждения соответствия в частичную функцию при использовании foreach. Теперь аналогично IntelliJ просит меня улучшить код. Разница в том, что я использую значения для соответствия:

val matchMe = "Foo"
keys.foreach(key =>
  key match {
    case `matchMe` => somethingSpecial()
    case _ => somethingNormal(key, calcWith(key))
  })

Рефакторинг для анонимной функции сопоставления изображений будет выглядеть примерно так:

keys.foreach {
  case `matchMe` => somethingSpecial(_)
  case _ => somethingNormal(_, calcWith(_)) //this doesn't work
}

Обратите внимание, что во втором случае я не могу использовать _, так как он мне нужен дважды. Есть ли способ использовать анонимную функцию сопоставления шаблонов здесь?

Ответы

Ответ 1

Вы не можете использовать подстановочный знак _ здесь, его цель - указать, что вам не важно, какое значение вы сравниваете.

Вы можете использовать именованный параметр:

keys.foreach {
  case `matchMe` => somethingSpecial(matchMe)
  case nonSpecialKey => somethingNormal(nonSpecialKey, calcWith(nonSpecialKey))
}

Без каких-либо ограничений на него он будет соответствовать любому значению. Обратите внимание, что порядок case важен, так как case x => ... соответствует чему-либо и будет существенно сокращать другие операторы case.


В стороне, я не думаю, что ваш somethingSpecial(_) делает то, что вы хотите/ожидаете. Это только короткая версия x => somethingSpecial(x), а не somethingSpecial(matchMe).