160

Scalaのパターンマッチングシステムを使用して比較でマッチングすることは可能ですか?例えば:

a match {
    case 10 => println("ten")
    case _ > 10 => println("greater than ten")
    case _ => println("less than ten")
}

2番目のcaseステートメントは不正ですが、「aがより大きい場合」を指定できるようにしたいと思います。

4

5 に答える 5

304

パターンの後にガード、つまりifブール式を追加できます。

a match {
    case 10 => println("ten")
    case x if x > 10 => println("greater than ten")
    case _ => println("less than ten")
}

編集:ガードが真でない場合、パターンは一致しないため、これは、のif 後にアフターを付けることとは表面的には異なることに注意してください。=>

于 2009-10-18T16:53:35.593 に答える
33

述語をmatch句に組み込む方法を尋ねた質問の精神に対する非回答として、この場合、述語はmatch:の前に因数分解することができます。

def assess(n: Int) {
  println(
    n compare 10 match {
      case 0 => "ten"
      case 1 => "greater than ten"
      case -1 => "less than ten"
    })
}

さて、のドキュメントは、scala.math.Ordering.compare(T, T)等しくない結果がゼロより大きい小さいことだけを約束します。JavaComparable#compareTo(T)はScalaと同じように指定されています。Scalaの現在の実装のように、正の値と負の値にそれぞれ1と-1を使用するのが一般的ですが、実装が下から変わるリスクがなければ、そのような仮定を立てることはできません。

于 2009-11-26T16:54:28.030 に答える
25

私の意見では、ガードを追加するよりもはるかに読みやすいソリューション:

(n compare 10).signum match {
    case -1 => "less than ten"
    case  0 => "ten"
    case  1 => "greater than ten"
}

ノート:

  • Ordered.compareこれがそれよりも小さい場合は負の整数を返し、大きい場合は正の整数を返します 0
  • Int.signum負の数(10未満)、正の数(10より大きい)、またはゼロ(10に等しい)の場合、からcompareへの出力を圧縮します。-110
于 2014-10-15T19:29:36.213 に答える
1

上記と以下のすべての回答は元の質問に完全に答えていますが、いくつかの追加情報はドキュメントhttps://docs.scala-lang.org/tour/pattern-matching.htmlにありますが、私の場合には適合しませんでしたしかし、このスタックオーバーフローの回答はGoogleでの最初の提案であるため、上記の質問のコーナーケースである私の回答を投稿したいと思います。
私の質問は:

  • 関数の引数を使用して一致式でガードを使用するにはどうすればよいですか?

言い換えることができます:

  • 関数の引数を使用して一致式でifステートメントを使用するにはどうすればよいですか?

答えは以下のコード例です。

    def drop[A](l: List[A], n: Int): List[A] = l match {
      case Nil => sys.error("drop on empty list")
      case xs if n <= 0 => xs
      case _ :: xs => drop(xs, n-1)
    }

ご覧のとおり、scala fiddleへのリンク:httpscase xs if n <= 0 => xs ://scalafiddle.io/sf/G37THif/2ステートメントはguard(if)ステートメントでn(関数の引数)を使用できます 。

これが私のような人に役立つことを願っています。

于 2019-03-13T08:28:56.400 に答える
0

Scalaのパターンマッチングにより、独自のエクストラクターを定義できます。この場合、新しいエクストラクタを定義するだけです。

class GreaterThan(n: Int) {
  def unapply(i: Int) = i > n
}

val GreaterThan10 = GreaterThan(10)

a match {
  case 10 => ???
  case GreaterThan10() => ???
  case _ => ???
}

または、パターンガードを使用します。

于 2022-02-26T16:58:02.827 に答える