可能重复:
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似乎有很多隐藏的功能,我想知道某人是否有一个简单的解决方案。
答案 0 :(得分:7)
您可以lift
从Any
到A
的部分功能转换为Any
到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
方法。你可以有几个案例条款。
答案 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