2

编辑:这是很久以前在 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为序列时也是如此。

4

2 回答 2

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
于 2009-04-11T23:56:08.767 回答
0

在匹配中使用了 unapply 或 unapplySeq 函数,而不是您似乎相信的 apply。

于 2009-04-11T20:16:40.837 回答