복붙노트

[SCALA] 어떻게 스칼라의 범위에서 할 수있는 I 패턴 일치?

SCALA

어떻게 스칼라의 범위에서 할 수있는 I 패턴 일치?

루비 나는이 쓸 수 있습니다 :

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

어떻게 스칼라에서이 작업을 수행합니까?

편집 : 바람직 나는 경우에 사용하는 것보다 더 우아하게 그것을하고 싶습니다.

해결법

  1. ==============================

    1.이 가드로 표현 될 수있는 내부 패턴 일치 :

    이 가드로 표현 될 수있는 내부 패턴 일치 :

    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"
    }
    
  2. ==============================

    2.

    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
    

    인스턴스를 포함 참고 초기 캡 이름을 지정해야합니다. 그렇지 않으면 (나도 몰라 탈출이 아니라면, 여기 어렵다), 당신은 백 따옴표로 이름을 부여해야합니다

  3. ==============================

    3.Yardena의 대답 @ 비슷하지만 기본적인 비교를 사용하여 :

    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 작동

  4. ==============================

    4.동일한 크기의 범위를 들어, 구식 수학와 함께 할 수 있습니다 :

    동일한 크기의 범위를 들어, 구식 수학와 함께 할 수 있습니다 :

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

    그래, 나도 알아 "neccessity없이 분할하지 마!" 그러나 : 나누기 등의 impera!

  5. from https://stackoverflow.com/questions/3160888/how-can-i-pattern-match-on-a-range-in-scala by cc-by-sa and MIT license