编辑:这是很久以前在 Scala 2.8 及更高版本中修复的旧错误
在围绕问题Pattern 将 String 匹配为 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
为序列时也是如此。