7

可能重复:
Scala:返回布尔值的模式匹配的简短形式

在我的 scala 代码中,我发现自己经常写如下内容:

x match{
   case Type(params) => doStuffWith(params)
   case _ => /* do nothing*/
}

是否已经有一些预定义的运算符来执行此操作?我认为如果我能写出这样的东西会更清楚:

if( x match Type(params)) {
    doStuffWith(params)
}

基本上避免了奇怪的情况。我还遇到过其他情况,如果能够以内联方式验证某些内容是否与模式匹配,这将为我节省一对额外的大括号。

我知道这种事情可能只会在编写更多迭代代码时更有用,但 Scala 似乎有很多隐藏的功能,我想知道是否有人对此有一个简单的解决方案。

4

4 回答 4

7

您可以lift将部分函数 from AnytoA转换为 from Anyto函数Option[A]

为了使语法更好,首先定义一个辅助函数:

def lifted[A]( pf: PartialFunction[Any,A] ) = pf.lift

然后,赚取利润:

val f = lifted {
  case Type(i) => doStuff(i)
}

scala> f(2)
res15: Option[Int] = None

scala> f(Type(4))
res16: Option[Int] = Some(8)

doStuff只有当参数匹配时才会调用该方法。你可以有几个case子句。

于 2012-09-04T13:46:32.763 回答
3

我能想到的最短方法是将值包装在一个选项中并使用 collect 方法:

Option(x).collect { case Type(params) => doStuffWith(params) }
于 2012-09-04T13:07:09.023 回答
3

使用@phant0m 提供的链接,将其拼写出来:

import PartialFunction.condOpt

condOpt(x){ case Type(params) => doStuffWith(params) }
于 2012-09-04T17:37:03.460 回答
0

如果这种模式经常出现在您的代码中,您应该考虑将doSomeStuff其转换为Type. Scala 中的案例类是普通类,您应该在有意义的时候使用面向对象的特性。

否则,您可以在层次结构的顶部添加一个方法,假设您的所有案例类都扩展了一个公共特征。例如:

class Base {
  def whenType(f: (T1, T2) => Unit): Unit = this match {
    case Type(t1, t2) => f(t1, t2)
    case _ => ()
  }
}

然后你可以使用x whenType doSomeStuff

于 2012-09-05T07:36:04.507 回答