스칼라의 패턴 매칭 시스템에서 비교 연산자 사용
스칼라의 패턴 매칭 시스템을 사용하여 비교할 수 있습니까? 예를 들면 다음과 같습니다.
a match {
case 10 => println("ten")
case _ > 10 => println("greater than ten")
case _ => println("less than ten")
}
두 번째 사례 진술은 불법이지만 "a보다 클 때"를 지정할 수 있습니다.
if
패턴 뒤에 가드, 즉 부울 식을 추가 할 수 있습니다 .
a match {
case 10 => println("ten")
case x if x > 10 => println("greater than ten")
case _ => println("less than ten")
}
편집 :이 이상 피상적 퍼팅 다릅니다하는 것으로 if
이후 을 =>
패턴이 있기 때문에 하지 않습니다 가드 사실이 아닌 경우 일치합니다.
술어를 일치 절에 통합하는 방법을 묻는 질문의 정신에 대한 비 응답으로,이 경우 술어는 match
:
def assess(n: Int) {
println(
n compare 10 match {
case 0 => "ten"
case 1 => "greater than ten"
case -1 => "less than ten"
})
}
이제 문서는scala.math.Ordering.compare(T, T)
동일하지 않은 결과가 0 보다 크 거나 작을 것이라는 약속 만합니다 . Java Comparable#compareTo(T)
는 Scala와 유사하게 지정됩니다. 스칼라의 현재 구현 에서와 같이 각각 양수 및 음수 값에 1과 -1을 사용하는 것이 일반적 이지만, 구현 이 아래에서 변경 될 위험이 없으면 그러한 가정을 할 수 없습니다.
내 의견으로는 경비원을 추가하는 것보다 훨씬 읽기 쉬운 솔루션입니다.
(n compare 10).signum match {
case -1 => "less than ten"
case 0 => "ten"
case 1 => "greater than ten"
}
노트:
Ordered.compare
이 값이 이보다 작 으면 음의 정수를 반환하고, 크면0
같고 같으면 양수를 반환 합니다.Int.signum
압축의 출력compare
에-1
음의 수 (10 개 미만)의 경우,1
양극 (10 이상)에, 또는0
영 (10와 동일).
위의 답변과 아래 답변 모두 원래 질문에 완벽하게 답변하지만 일부 추가 정보는 https://docs.scala-lang.org/tour/pattern-matching.html 설명서에서 찾을 수 있지만 내 경우에는 맞지 않습니다. 그러나이 stackoverflow 답변은 Google의 첫 번째 제안이므로 위 질문의 모퉁이 인 답변을 게시하고 싶습니다.
내 질문은 :
- 함수의 인수와 일치 식에서 가드를 사용하는 방법은 무엇입니까?
어떤 말로 표현할 수 있습니까?
- 함수의 인수와 일치하는 식에서 if 문을 사용하는 방법은 무엇입니까?
대답은 아래 코드 예입니다.
def drop[A](l: List[A], n: Int): List[A] = l match {
case Nil => sys.error("drop on empty list")
case xs if n <= 0 => xs
case _ :: xs => drop(xs, n-1)
}
scala fiddle에 링크 : https://scalafiddle.io/sf/G37THif/2 보시 다시피 case xs if n <= 0 => xs
명령문은 guard (if) 문과 함께 n (함수의 인수)을 사용할 수 있습니다.
나는 이것이 나와 같은 누군가를 돕기를 바랍니다.
'programing tip' 카테고리의 다른 글
vim에서 더 유용한 상태 표시 줄? (0) | 2020.06.15 |
---|---|
한 줄 목록 이해 : if-else 변형 (0) | 2020.06.15 |
파일을 선택할 때 업로드 양식을 자동 제출하려면 어떻게합니까? (0) | 2020.06.15 |
다른 테이블에없는 행을 선택하십시오. (0) | 2020.06.15 |
이 milw0rm 힙 스프레이 익스플로잇은 어떻게 작동합니까? (0) | 2020.06.15 |