class Contains(r: Range) { def unapply(i: Int): Boolean = r contains i }
val C1 = new Contains(3 to 10)
val C2 = new Contains(20 to 30)
scala> 5 match { case C1() => println("C1"); case C2() => println("C2"); case _ => println("none") }
C1
scala> 23 match { case C1() => println("C1"); case C2() => println("C2"); case _ => println("none") }
C2
scala> 45 match { case C1() => println("C1"); case C2() => println("C2"); case _ => println("none") }
none
Tenga en cuenta que las instancias de Contiene deben nombrarse con mayúsculas iniciales. Si no lo hace, tendrá que dar el nombre en la espalda comillas (difícil aquí, a menos que haya un escape no sé)
Ver una pregunta StackOverflow relacionada: [Puede una gama ser igualada en Scala?] (Http: //stackoverflow.com/questions/1346127/can-a-range-be-matched-in-scala) –