23

「マッチは網羅的ではない!」をどうやって抑えることができますか?次のScalaコードで警告しますか?

val l = "1" :: "2" :: Nil
l.sliding(2).foreach{case List(a,b) => }

これまでに見つけた唯一の解決策は、パターンマッチングを追加のmatchステートメントで囲むことです。

l.sliding(2).foreach{x => (x: @unchecked) match {case List(a,b) => }}

ただし、これにより、コードが不必要に複雑になり、かなり読みにくくなります。したがって、より短く、より読みやすい代替手段が必要です。誰か知っていますか?

編集

私のリストlには私のプログラムに少なくとも2つの要素があることを言及するのを忘れました。だから私は安全に警告を抑えることができます。

4

4 に答える 4

21

ここにいくつかのオプションがあります:

  1. 網羅性チェックがないため、のSeq代わりに一致させることができます(これは、元の要素のように、1つの要素リストで失敗します)。ListSeq

    l.sliding(2).foreach{case Seq(a, b) => ... }
    
  2. 理解のためにforを使用できます。これにより、一致しないものはすべてサイレントに破棄されます(したがって、1つの要素リストでは何も実行されません)。

    for (List(a, b) <- l.sliding(2)) { ... }
    
  3. を使用できますcollect。これにより、一致しないものはすべてサイレントに破棄されます(また、必要に応じて反復する必要があるイテレータが返されます)。

    l.sliding(2).collect{case List(a,b) => }.toList
    
于 2012-11-05T11:24:53.153 に答える
20

で完成させるの; case _ => ???はかなり短いです。 ???例外をスローするだけです。2.9以前を使用している場合は、独自に定義できます(2.10の新機能)。

一致アノテーションに必要なものと比較すると、実際にはかなり短いです。

(: @unchecked)
; case _ => ???
              ^  One more character!

をスローしませんがMatchError、それは本当に重要ですか?

于 2012-11-05T10:20:14.863 に答える
3

sliding(2)要素が1つしかない最後のリストを返す可能性があるため、次のこともテストする必要があります。

l sliding(2) foreach {
  case a::b::Nil => println("two elements: " + a + b)
  case l         => println("one last element" + l.head)
}
于 2012-11-05T10:27:04.107 に答える
1
implicit class RichAny[A](private val a: A) extends AnyVal {
  @inline
  def match_ignoring_nonexhaustive[B](f: PartialFunction[A,B]): B = f(a)
}

これを使用すると、次のことができます。これは、実際には大文字と小文字の一致のみをPartialFunctionとして解釈します。

l.sliding(2).foreach{ _ match_ignoring_nonexhaustive {case List(a,b) => }}
于 2017-01-09T18:19:59.827 に答える