2009-04-11 28 views
2

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 

これは基本的に空のSeqSeq.empty自動的に等しくないことを意味します。 したがって、(starblueが示唆するように抽出器を使用するのではなく)定数に対してマッチングするとき、この不等式は失敗したマッチにつながります。 空であるStringをシーケンスとして解釈する場合も同様です。

+1

明らかに、これはScala 2.8で解決されます。それを楽しみにしています。 –

+0

良い例ですが、バグが修正されたため(おそらく数年前)に期限切れになりました。これらをスタックに入れて検索に表示されないようにするStackoverflowポリシーは何ですか? – akauppi

+0

これはScala <2.8のみに適用されると印象づけてください(コメントにありますが、読んでいません)。 Metaには、s.aの問題とは何かに関するオープンな議論があります。これは:http://meta.stackoverflow.com/questions/252520/mark-questions-or-answers-as-out-of-date – akauppi

答えて

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 
+0

バグは本当にリストやリッチストリングなどのSeq [A]の多くのサブタイプですList()resp。( "":Seq [Char]))で構築されている場合はSeq.emptyと等しくないのに対し、RandomAccessSeqなどはSeq.emptyと等しくなりません。これは何らかの理由で意図的なことがありますか? –

0

unapplyまたはunapplySeq関数のマッチングでは、あなたが信じていると思われるように適用されません。

関連する問題