2

編集: これは、Scala 2.8 以降で修正されてから長い間、古いバグでした。

Pattern matching a String as Seq[Char] という質問に関するいくつかの実験中に、別の奇妙な一致現象に出くわしました。文字列を一連の文字として扱う次のコードを考えてみましょう。

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

空の String で input を呼び出すと、""正しく生成され"Empty"ます。

ただし、最初の一致句を次のように書き直すと、

case Seq.empty => "Empty"

の一致は""失敗し、代わりに default 句に一致します。

Scala ライブラリのソース コードを見ていくと (理想的な世界では、これを行う必要はありません :-))、 と のSeq()両方Seq.emptyRandomAccessSeq.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 関数が使用されている場合、あなたが信じているように適用されません。

于 2009-04-11T20:16:40.837 に答える