2016-08-03 5 views
1

깨끗한 pattern-matching 코드를 작성하고 싶습니다. 에 대한 대안으로목록의 값 중 일치

myInputString match { 
    case matchAnyRegexFromMyList(s) => //do something 
} 

: 그것에서

myInputString match { 
    case regex1(a)|regex2(b)... => //do something 
} 

가 내가 좋아하는 것

val myList = List(
    ".+\\.a".r, 
    ".+\\.b".r, 
    ".+\\.c".r.+ 
) 

다음과 같은 접근 뭔가를 :

나는 List Regex의가있다 더 간결하게 적어도 가능한가?

답변

3

:

당신은 비록 사용자 지정 추출기를 사용할 수 있습니다.

val myList = List(".+\\.a" 
       , ".+\\.b" 
       , ".+\\.c") 

val myListRE = myList.mkString("|").r 

"blah.b" match { 
    case myListRE() => println("hit") 
} 
3

런타임에 대문자를 생성 할 수 없습니다. 컴파일 할 때 매크로를 작성하여 작성할 수 있습니다. 당신의 패턴들은 컴파일 할 때 당신이 그들을 결합 할 수있는 사전 컴파일되지 않은 경우

case class MultiPattern(patterns: List[Regex]) { 
    def unapply(s: String): Option[String] = 
    patterns.flatMap(_.findFirstIn(s)).headOption 
} 

val myMultiPattern = MultiPattern(myList) 

val myInputString = "x.b" 
myInputString match { 
    case myMultiPattern(s) => println(s) // output: x.b 
} 
+0

또한 이것을 매개 변수화 한 다음 'val'을 사용하여 상수를 만들 수 있습니다. –

+0

힌트를 보내 주셔서 감사합니다; 나는 대답을 업데이트했다. – devkat