1

Я пытаюсь сопоставить значение enum, преобразованное в строку, содержащуюся в коллекции. Вот код:Какой самый идиоматический путь в Scala для соответствия шаблону на значениях перечисления Seq, преобразованных в строки?

object Foo extends Enumeration { 
    val ONE = Value("ONE") 
    val TWO = Value("TWO") 
} 

def check(seq: Seq[String]): Unit = seq match { 
    case Seq(Foo.ONE.toString) => println("match") 
    case _ => println("no match") 
} 

Это приводит к ошибке компиляции:

error: stable identifier required, but Foo.ONE.toString found. 
      case Seq(Foo.ONE.toString) => println("match") 

Что такое правильный способ использовать мои Foo перечисленных значения в качестве элементов согласующего моего образца заявления случае?

+1

Вы не можете применить какую-либо функцию внутри шаблона (там '.toString'). – cchantep

+0

Вы хотите узнать, являются ли _all_ элементами 'Seq()' значениями строки 'Foo' или просто _any_ из них? Вам нужно сообщить, какие элементы соответствуют, или это просто логический (то есть совпадение найдено/не найдено)? – jwvh

+0

@cchantep прибил его на голову, я должен был сопоставлять «case Seq (Foo.ONE)». Благодарность за вклад каждого! – nmurthy

ответ

1

Мне нравится ответ от @cchantep, который должен был избежать вызова .toString внутри соответствия шаблону и реализовать метод check следующим образом:

def check(seq: Seq[Foo.Value]): Unit = seq match { 
    case Seq(Foo.ONE) => println("match") 
    case _ => println("no match") 
} 
1

Карта его обратно в перечислении первого:

import scala.util.Try 

val enumSeq = seq map (x => Try(Foo.withName(x))) 

Тогда вы можете отфильтровать Failure с или матч на Seq(Success(ONE)), Seq(Success(ONE)), ..., Seq(Failure) и т.д.

1
def check(seq: Seq[String]): Unit = seq match { 
    case Seq(s @ _) if s == Foo.ONE.toString => println("match") 
    case _ => println("no match") 
} 
Смежные вопросы