1

式が特定のパターンに一致するかどうかを確認する簡潔な方法はありますか? たとえば、次のコードを考えてみましょう。

val result = expr match {
    SomePattern(_, 1, _) => true
    _ => false
}

このコードは機能しますが、かなりノイズが多く、長いです。同じことを達成するためのより良い方法があるかどうか疑問に思っていました。matchesScala に構造体があれば素晴らしいだろう。

val result = expr matches SomePattern(_, 1, _)

これらの線に沿って何かを可能にするヘルパー関数を作成することも検討します。しかし、私が知る限り、パターンを引数として渡すことができないため、それは難しいようです。Scala 2.10 で (実験的な機能として) 利用可能なマクロで、このようなことが可能になるでしょうか?

4

3 に答える 3

2
scala> import PartialFunction.cond
import PartialFunction.cond

scala> cond(Option(2)) { case Some(2) => true }
res0: Boolean = true

scala> cond(Option(3)) { case Some(2) => true }
res1: Boolean = false

そうは言っても、私は過去に「一致」をサポートしていましたが、それと呼ばれる方法はたくさんあります.

于 2013-02-01T15:37:40.657 に答える
1

次のようなことを行う関数「matches」を定義できます。

scala> def matches[A](a: A)(f: PartialFunction[A, Unit]) = f isDefinedAt a
matches: [A](a: A)(f: PartialFunction[A,Unit])Boolean

scala> matches("abc") { case "abc" => () }
res0: Boolean = true

scala> matches("abc") { case "x" => () }
res1: Boolean = false
于 2013-02-01T15:06:18.460 に答える
0

コンストラクトで許可されているのとまったく同じ構文を使用して、 sを関数リテラルとしてmatch書き込むことができます。PartialFunctionしかし、コンパイラはそれが必要なことを知っている必要があります。言い換えれば、型推論を推進するために何かが必要です。

scala> val pf1 = { case i: Int if i % 2 == 0 => true; case i: Int => false }
<console>:42: error: missing parameter type for expanded function
The argument types of an anonymous function must be fully known. (SLS 8.5)
Expected type was: ?
       val pf1 = { case i: Int if i % 2 == 0 => true; case i: Int => false }
                 ^

scala> val pf2: Function[Int, Boolean] = { case i: Int if i % 2 == 0 => true; case _ => false }
<console>:42: error: $r.intp.global.Function does not take type parameters
       val pf2: Function[Int, Boolean] = { case i: Int if i % 2 == 0 => true; case _=> false }
                ^
<console>:42: error: missing parameter type for expanded function
The argument types of an anonymous function must be fully known. (SLS 8.5)
Expected type was: <error>
       val pf2: Function[Int, Boolean] = { case i: Int if i % 2 == 0 => true; case _=> false }
                                         ^

scala> val pf3: PartialFunction[Int, Boolean] = { case i: Int if i % 2 == 0 => true; case _ => false }
pf3: PartialFunction[Int,Boolean] = <function1>
于 2013-02-01T15:04:56.580 に答える