2011-10-08 2 views
22

현재 스칼라에서 첫 단계를 밟고 있으므로 일반적인 문제에 대한 최선의 방법을 찾고 있습니다. 다음은 작동하지 않지만 원하는 작업을 설명하는 코드입니다. 이 문제에 대한 최선의 접근 방식을 권해 주시겠습니까? 구문의 측면에서스칼라 문자열 패턴 모범 사례 일치

def resolveDriver(url: String) = { 
    url match { 
     case url.startsWith("jdbc:mysql:") => "com.mysql.jdbc.Driver" 
     case url.startsWith("jdbc:postgresql:") => "org.postgresql.Driver" 
     case url.startsWith("jdbc:h2:") => "org.h2.Driver" 
     case url.startsWith("jdbc:hsqldb:") => "org.hsqldb.jdbcDriver" 
     case _ => throw new IllegalArgumentException 
    } 
    } 
+2

도 참조 [이 질문] (http://stackoverflow.com/q/7586605/53013) 다른 방법으로이 문제를 해결하기 위해, 일치하는 부분이 전체 프로토콜 일 경우 –

답변

39

, 당신은 단지 작은 조금 당신이 경우 문을 수정할 수 있습니다

case url if url.startsWith("jdbc:mysql:") => "com.mysql.jdbc.Driver" 

이 단순히 (도 url입니다) 패턴 표현에 값 url을 결합하고 가드를 추가 테스트와 함께 표현입니다. 그것은 코드를 컴파일해야합니다. 관리 할 않는 것입니다

def resolveDriver(url: String) = url match { 
    case u if u.startsWith("jdbc:mysql:") => Some("com.mysql.jdbc.Driver") 
    case u if u.startsWith("jdbc:postgresql:") => Some("org.postgresql.Driver") 
    case _ => None 
} 

:

는 당신이 옵션 [문자열]을 반환 할 수 있습니다, 그것은 조금 더 스칼라 같은하려면 (그냥 그림은 이후 나는 몇 절을 제거) 예외.

+0

고마워! 그게 정확히 내가 찾고 있던거야! 나는 내가 과체중과 같은 냄새를 맡은 케이스 클래스를 만들기 위해 이미 자신을 준비하고 있었다는 질문에 '다행이다. 또한 예외 던지기에 나를 고쳐 주셔서 감사합니다. –

10

다른 방법이 있습니다. 모든 매핑을지도에 저장 한 다음 collectFirst 메서드를 사용하여 일치하는 항목을 찾습니다. collectFirst의 유형 서명은 다음과 같습니다

def TraversableOnce[A].collectFirst[B](pf: PartialFunction[A, B]): Option[B] 

사용법 :

scala> val urlMappings = Map("jdbc:mysql:" -> "com.mysql.jdbc.Driver", "jdbc:postgresql:" -> "org.postgresql.Driver") 
urlMappings: scala.collection.immutable.Map[java.lang.String,java.lang.String] = Map(jdbc:mysql: -> com.mysql.jdbc.Drive 
r, jdbc:postgresql: -> org.postgresql.Driver) 

scala> val url = "jdbc:mysql:somestuff" 
url: java.lang.String = jdbc:mysql:somestuff 

scala> urlMappings collectFirst { case(k, v) if url startsWith k => v } 
res1: Option[java.lang.String] = Some(com.mysql.jdbc.Driver) 
+0

'match'에 대한 추상화를 제안 해 주신 것에 감사드립니다. –

+0

@mojojojo :별로. 'match' 다음에 나오는'case' 표현식 세트는'PartialFunction'을 구성합니다. 'collectFirst'는'PartialFunction'을 받아서 콜렉션을 반복하고,'Some'으로 싸여진 첫 번째 매치를 반환하는 메소드입니다. 일치하는 항목이 없으면 'None'을 반환합니다. – missingfaktor

+0

@mojojojo : 출처 : http://goo.gl/Q4UNz를 참조하십시오. – missingfaktor

관련 문제