web-dev-qa-db-ja.com

Scalaの範囲でパターンマッチングを行うにはどうすればよいですか?

Ruby私はこれを書くことができます:

case n
when 0...5  then "less than five"
when 5...10 then "less than ten"
else "a lot"
end

Scalaでこれを行うにはどうすればよいですか?

編集:できれば、ifを使用するよりもエレガントにやりたいと思います。

39
Theo

内側のパターンマッチは、ガードで表現できます。

n match {
  case it if 0 until 5 contains it  => "less than five"
  case it if 5 until 10 contains it => "less than ten"
  case _ => "a lot"
}
65
Yardena
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

含むインスタンスには、初期キャップを付けて名前を付ける必要があることに注意してください。そうでない場合は、名前を引用符で囲む必要があります(私が知らないエスケープがない限り、ここでは困難です)

14
Randall Schulz

@Yardenaの回答に似ていますが、基本的な比較を使用しています。

n match {
    case i if (i >= 0 && i < 5) => "less than five"
    case i if (i >= 5 && i < 10) => "less than ten"
    case _ => "a lot"
}

浮動小数点nでも機能します

11
gens

同じサイズの範囲の場合、昔ながらの数学でそれを行うことができます。

val a = 11 
(a/10) match {                      
    case 0 => println (a + " in 0-9")  
    case 1 => println (a + " in 10-19") } 

11 in 10-19

はい、私は知っています:「必要なしに分割しないでください!」しかし:分割統治!

4
user unknown