2009-04-11 8 views
2

편집 : 이것은 오래 오래 전부터 스칼라 2.8에서 수정 된 버그 이후빈 문자열이 Seq.empty와 일치하지 않는 이유는 무엇입니까?

질문 Pattern matching a String as Seq[Char] 주위에 몇 가지 실험을하는 동안, 나는 또 다른 이상한 일치하는 현상을 가로 질러했다. ""가 제대로 "Empty" 산출 빈 문자열에

def %%&#(input: String) : String = { 
    val uha : Seq[Char] = input 
    uha match { 
     case Seq() => "Empty" 
     case Seq(first @ _, 'o', 'o') => "Bar" 
     case _ => "Oh" 
    } 
} 

호출 입력 : 문자의 순서로 문자열을 처리하는 다음 코드를 살펴 보자. 내가

case Seq.empty => "Empty" 

로 첫 경기 절을 다시 작성하는 경우

그러나 ""의 매칭은 실패하고 대신 기본 절을 일치합니다.

스칼라 라이브러리 소스 코드 (이상적인 세상에서해야 할 일이 아닙니다 .-))을 걷는 중 Seq()Seq.empty은 모두 RandomAccessSeq.empty이됩니다. 분명히, Seq() 만 빈 문자열과 일치하기 때문에 위에서 설명한 현상과 일치하지 않습니다.

업데이트 : 몇 가지 더 실험시이 문제는 다음에 좁혀 수 있습니다

val list = List() 
    >>> list2: List[Nothing] = List() 
val emptySeq = Seq.empty 
list == emptySeq 
    >>> res1: Boolean = false 

이 기본적으로 빈 Seq가 자동으로 동일 Seq.empty하지 않는 것을 의미한다. 그래서 상수와 일치 할 때 (starblue가 제안한 것과 같이 추출기를 사용하는 것과는 대조적으로)이 불평등은 실패한 일치를 유도합니다. String을 시퀀스로 해석 할 때도 마찬가지입니다.

+1

분명히 스칼라 2.8에서 해결 될 것입니다. 기대하고 있습니다. –

+0

버그가 수정되었으므로 만료되었지만 (이미 수 년 전) 만료되었습니다. 검색 결과에 나타나지 않도록 이들을 넣는 Stackoverflow 정책은 무엇입니까? – akauppi

+0

스칼라 <2.8 만 적용됩니다 (코멘트에 있지만 우리는 거기서 읽지 않습니다). Meta는 s.a와 관련된 문제에 대해 공개 토론을하고 있습니다. this : http://meta.stackoverflow.com/questions/252520/mark-questions-or-answers-as-out-of-date – akauppi

답변

4

이것은 라이브러리의 버그 인 것 같습니다. 벌레를 신고 하시겠습니까, 아니면 제가해야합니까?

scala> Seq.empty match {case Seq() => "yup"; case _ => "nope"} 
res0: java.lang.String = yup 

scala> Seq() match {case Seq.empty => "yup"; case _ => "nope"} 
res1: java.lang.String = yup 

scala> ("" : Seq[Char]) match {case Seq() => "yup"; case _ => "nope"}  
res2: java.lang.String = yup 

scala> ("" : Seq[Char]) match {case Seq.empty => "yup"; case _ => "nope"} 
res3: java.lang.String = nope 
+0

버그는 실제로 List 및 RichString과 같은 Seq [A]의 많은 하위 유형입니다. List() resp. ("": Seq [Char])를 사용하여 생성 될 때 Seq.empty와 같지 않지만 RandomAccessSeq와 같은 다른 것들은 Seq.empty와 동일하지 않습니다. 이것은 어떤 이유로 의도적 일 수 있습니까? –

0

unapply 또는 unapplySeq 함수가 일치하는 데 사용되는 것으로 믿는 것처럼 적용되지 않습니다.