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
Należy pamiętać, że wystąpienia instancji powinny mieć nazwy z początkowymi literami. Jeśli nie, musisz podać nazwę w back-cytaty (trudno tu chyba nie ma ucieczki nie wiem)
Zobacz powiązany stackoverflow pytanie: [Czy zakres być dopasowany w Scala?] (Http: //stackoverflow.com/questions/1346127/cana-a-range-be-matched-in-scala) –