РЕДАКТИРОВАТЬ: Это была старая ошибка, давно исправленная в 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
как последовательности.