1

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

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

虽然此代码有效,但它相当嘈杂且冗长。我想知道是否有更好的方法来实现同样的目标。如果 Scala 有一个构造,那就太好了matches,它允许人们编写

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

您可以定义一个执行类似操作的函数“匹配”,例如:

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

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

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 回答