EDIT:これは、古い長い以来のScala 2.8で修正されたバグ以降空の文字列がSeq.emptyと一致しないのはなぜですか?
質問Pattern matching a String as Seq[Char]周りにいくつかの実験中に、私は別の奇妙な一致現象に出会いました。 ""
が正しく"Empty"
生み出す空の文字列に
def %%&#(input: String) : String = {
val uha : Seq[Char] = input
uha match {
case Seq() => "Empty"
case Seq(first @ _, 'o', 'o') => "Bar"
case _ => "Oh"
}
}
呼び出す入力:文字列として文字列を扱う次のコードを考えてみましょう。
私は
case Seq.empty => "Empty"
として最初のmatch句を書き換える場合は、""
のマッチングが失敗し、代わりにデフォルトの句に一致します。
Scalaライブラリのソースコードを歩いてください(これは理想的な世界ではありません:-))私はSeq()
とSeq.empty
の両方がRandomAccessSeq.empty
になると信じています。明らかに、Seq()
だけが空文字列と一致するので、これは上記の現象と一致しません。
UPDATE:いくつかのさらなる実験の際に、この質問には、以下に絞り込むことができます。
val list = List()
>>> list2: List[Nothing] = List()
val emptySeq = Seq.empty
list == emptySeq
>>> res1: Boolean = false
これは基本的に空のSeq
がSeq.empty
自動的に等しくないことを意味します。 したがって、(starblueが示唆するように抽出器を使用するのではなく)定数に対してマッチングするとき、この不等式は失敗したマッチにつながります。 空であるString
をシーケンスとして解釈する場合も同様です。
明らかに、これはScala 2.8で解決されます。それを楽しみにしています。 –
良い例ですが、バグが修正されたため(おそらく数年前)に期限切れになりました。これらをスタックに入れて検索に表示されないようにするStackoverflowポリシーは何ですか? – akauppi
これはScala <2.8のみに適用されると印象づけてください(コメントにありますが、読んでいません)。 Metaには、s.aの問題とは何かに関するオープンな議論があります。これは:http://meta.stackoverflow.com/questions/252520/mark-questions-or-answers-as-out-of-date – akauppi