检查表达式是否与Scala中的模式匹配的简洁方法

时间:2013-02-01 14:50:02

标签: scala pattern-matching

有没有简洁的方法来检查表达式是否与给定的模式匹配?例如,请考虑以下代码:

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

虽然这段代码有效,但它噪音很大而且很长。我想知道是否有更好的方法来实现同样的目标。如果Scala有一个matches构造,那么就可以写一个

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

我甚至会考虑编写一个辅助函数来使这些行成为可能。然而,这似乎很难做到,因为就我所知,我无法将模式作为论据传递。使用Scala 2.10中提供的宏(作为实验性功能)可能会出现类似的情况吗?

3 个答案:

答案 0 :(得分: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

那就是说,我过去支持“匹配”,虽然有很多方法可以称之为。

答案 1 :(得分:1)

你可以定义一个“匹配”的功能,例如:

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

答案 2 :(得分:0)

match构造允许的完全相同的语法可用于将PartialFunction s写为函数文字。但编译器必须知道这是必需的。换句话说,它需要一些东西来驱动类型推断:

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>