scala是否有“test-if-match”运算符?

时间:2012-09-04 12:49:30

标签: scala pattern-matching

  

可能重复:
  Scala: short form of pattern matching that returns Boolean

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

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

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

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

基本上避免了奇怪的情况。我还有其他情况可以验证某些内容是否符合内联方式,这样可以为我节省额外的一对括号。

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

4 个答案:

答案 0 :(得分:7)

您可以liftAnyA的部分功能转换为AnyOption[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方法。你可以有几个案例条款。

答案 1 :(得分:3)

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

Option(x).collect { case Type(params) => doStuffWith(params) }

答案 2 :(得分:3)

使用@ phant0m提供的链接拼出来:

import PartialFunction.condOpt

condOpt(x){ case Type(params) => doStuffWith(params) }

答案 3 :(得分:0)

如果您的代码中经常出现此模式,则应考虑将doSomeStuff转换为Type的方法。 Scala中的Case类是普通类,你应该在它们有意义时使用面向对象的特性。

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

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

然后您可以使用x whenType doSomeStuff