編集: これは、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.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
空をシーケンスとして解釈する場合も同様です。