2009-04-11 10 views
10

스칼라에서는 문자열의 임의 문자를 기준으로 Seq [Char]로 처리하여 패턴을 공식화 할 수 있습니다.문자열을 Seq [Char]로 매칭하는 패턴

object RegExpTest1 extends Application { 
def containsScala(x: String): Boolean = { 
    val z: Seq[Char] = x 
    z match { 
     case Seq('s','c','a','l','a', rest @ _*) => 
       println("rest is "+rest) 
       true 
     case Seq(_*) => 
       false 
    } 
} 

}

나는이 함께이 문제는 조각의 세 번째 줄은 다음과 같습니다

이 기능의 예는이 거기에 사용 된 예제 코드 A Tour of Scala

에서 언급 :

val z: Seq[Char] = x 

왜 이런 종류의 캐스트가 필요한가요? 모든 상황 (패턴 일치 포함)에서 문자열이 Seq [Char]처럼 동작해야합니까? 그러나이 변환이 없으면 코드 스 니펫이 작동하지 않습니다.

답변

11

이것이 맞으면 100 % 확신 할 수 없지만 내 직감에 의하면이 명시 적 캐스트가 없으면 원하는 내용이 아닌 java.lang.String과 패턴을 일치시킬 것이라고 나와 있습니다.

명시 적 형변환은 Scala 컴파일러에서 암시 적 변환 Predef.stringWrapper을 사용하도록합니다. 따라서 RichStringSeq[Char]으로 확장되므로 문자열이 문자 시퀀스 인 것처럼 패턴 일치를 수행 할 수 있습니다.

+0

그것은 많은 의미를 가지며 기본적으로 제가 추측 한 것입니다. 그러나 암시 적 변환기를 찾지 못했습니다. 그것을 지적 주셔서 감사합니다. 기본적으로 이는 Java 상호 운용성의 주요 이점으로 일부 유형의 건전성을 희생합니다. –

+2

유형이 손상되지 않습니다.암시 적 변환은 컴파일러에서 z와 같은 함수 호출을 삽입하는 것입니다. Seq [Char] = string2Seq (x) –

7

안드리가 말한 모든 것을 반향시킵니다. 상호 운용성을 위해 스칼라 문자열은 java.lang.String입니다. Predef에는 String에서 RichString으로의 암시 적 변환이 있으며 이는 Seq[Char]을 구현합니다. 잡아 중간 발 z을 필요로하지 않고, 패턴 일치를 코딩

아마 더 좋은 식으로 Seq[Char] :

질문과 코멘트에 계속 용어의 진짜 학대가있다
def containsScala(x: String): Boolean = { 
    (x: Seq[Char]) match { 
    ... 
    } 
} 
17

. 이 코드에는 캐스트가 없으며 특히 "기본적으로 Java 상호 운용성의 주요 이점은 일부 유형의 건전성을 희생하는 것입니다."현실에 근거가 없습니다.

스 캐 캐스팅은 다음과 같습니다 : x.asInstanceOf[Y].
은 당신이 위의 내용 참조하는 과제입니다 : String에서 Seq[Char]에 암시 적 변환이 있기 때문에 val z: Seq[Char] = x

이 할당이 합법적이다. 나는 다시 강조한다 이것은 캐스트가 아니다. 캐스트는 런타임에 실패 할 수있는 임의의 어설 션입니다. 암시 적 변환이 실패 할 수있는 방법은 없습니다.

형식 간의 암시 적 변환과 원본 질문에 대한 응답에 따라 문제는 원래 값이 형식 검사를 수행하지 않을 경우에만 암시 적 변환이 발생한다는 것입니다. String에 매치하는 것이 완벽하게 합법적이므로, 변환은 일어나지 않으며, 매치는 실패합니다.

+1

String은 Seq [Char]를 Java 유형의 typedef이므로 직접 상속 할 수 없습니다. –

+2

죄송 합니다만, 유형의 양보가 있습니다 (실제로는 스칼라가 그들과 함께 수영 중입니다). 유형의 건전성이 손상되지 않는다는 것이 아니라 특정 의미가 있으며 영향을받지 않습니다. – extempore