접속사와 패턴 매칭 (PatternA AND PatternB)
Scala에는 패턴 매칭에서 분리를 지원하는 언어 기능이 있습니다 ( 'Pattern Alternatives') :
x match {
case _: String | _: Int =>
case _ =>
}
그러나 조사가 PatternA 와 PatternB (결합)를 충족하는 경우 작업을 트리거해야하는 경우가 많습니다 .
이 기능을 추가하는 패턴 조합기 '&&'를 만들었습니다. 내가 Scala를 좋아하는 이유를 상기시켜주는 세 개의 작은 선!
// Splitter to apply two pattern matches on the same scrutiny.
object && {
def unapply[A](a: A) = Some((a, a))
}
// Extractor object matching first character.
object StartsWith {
def unapply(s: String) = s.headOption
}
// Extractor object matching last character.
object EndsWith {
def unapply(s: String) = s.reverse.headOption
}
// Extractor object matching length.
object Length {
def unapply(s: String) = Some(s.length)
}
"foo" match {
case StartsWith('f') && EndsWith('f') => "f.*f"
case StartsWith('f') && EndsWith(e) && Length(3) if "aeiou".contains(e) => "f..[aeiou]"
case _ => "_"
}
토론 포인트
- 이를 수행하는 기존 방법이 있습니까?
- 이 접근 방식에 문제가 있습니까?
- 이 접근법이 다른 유용한 결합자를 만들 수 있습니까? (예
Not
:) - 그러한 결합자를 표준 라이브러리에 추가해야합니까?
업데이트 방금 컴파일러가 case A && B && C
. 이는 중위 연산자 패턴입니다 (Scala 참조의 섹션 8.1.9). 표준 추출 패턴 (8.1.7)을 사용하여 &&(&&(A, B), C).' Notice how the expressions are associated left to right, as per normal infix operator method calls like
Boolean # && in
val b = true && false && true`로 표현할 수도 있습니다.
이 트릭을 정말 좋아합니다. 나는 이것을 수행하는 기존의 방법을 알지 못하며 그것에 대해 어떤 문제도 예견하지 못합니다.하지만 큰 의미는 아닙니다. 을 만드는 방법을 생각할 수 없습니다 Not
.
표준 라이브러리에 추가하는 것에 관해서는 ... 아마도. 근데 좀 힘들 것 같아요. 반면에 Scalaz 사람들에게 그것을 포함시키는 것은 어떻습니까? 그것은 자신의 bailiwick과 훨씬 더 비슷해 보입니다.
이에 대한 가능한 문제는 패턴 매 처가 생성하는 비대해진 번역입니다. 다음은로 생성 된 샘플 프로그램 의 번역 입니다 scalac -print
. 심지어 -optimise
단순화하는 데 실패 if (true) "_" else throw new MatchError()
표현합니다.
큰 패턴 일치는 이미 단일 메서드에 대해 합법적 인 것보다 더 많은 바이트 코드를 생성하며이 결합자를 사용하면 해당 문제가 증폭 될 수 있습니다.
&&
언어에 내장되어 있다면 번역이 더 스마트해질 수 있습니다. 또는에 대한 작은 개선 -optimise
이 도움 이 될 수 있습니다.
참고 URL : https://stackoverflow.com/questions/2261358/pattern-matching-with-conjunctions-patterna-and-patternb
'IT Share you' 카테고리의 다른 글
JAX-RS로 DRY 유지 (0) | 2020.12.05 |
---|---|
Xcode 9 iOS 11 BoringSSL SSL_ERROR_ZERO_RETURN (0) | 2020.12.05 |
참조 : MySQL 확장을 사용하는 완벽한 코드 샘플은 무엇입니까? (0) | 2020.12.05 |
iPad에서 Javascript 디버깅 (0) | 2020.12.05 |
HTML5 데이터베이스와 localStorage를 하위 도메인간에 공유 할 수 있습니까? (0) | 2020.12.05 |