Почему пустая строка не совпадает с Seq.empty? - PullRequest
2 голосов
/ 11 апреля 2009

РЕДАКТИРОВАТЬ: Это была старая ошибка, давно исправленная в Scala 2.8 и более поздних версиях

Во время некоторых экспериментов вокруг вопроса Паттерн, совпадающий со строкой как Seq [Char] , я столкнулся с другим странным феноменом соответствия. Рассмотрим следующий код, который обрабатывает строку как последовательность символов:

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

Вызов ввода для пустой строки "" правильно выдает "Empty".

Однако, если я переписываю первое предложение соответствия как

case Seq.empty => "Empty"

совпадение "" не выполняется и соответствует предложению по умолчанию.

Просматривая исходный код библиотеки Scala (что не нужно делать в идеальном мире :-)), я считаю, что и 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 как последовательности.

Ответы [ 2 ]

4 голосов
/ 12 апреля 2009

Это похоже на ошибку в библиотеке. Вы хотите сообщить об ошибке или нет?

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 голосов
/ 12 апреля 2009

При сопоставлении используются функции unapply или unapplySeq, а не применяются, как вам кажется.

...