加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala可选模式匹配

发布时间:2020-12-16 09:51:44 所属栏目:安全 来源:网络整理
导读:我发现自己经常使用模式匹配来返回一个选项,其中无匹配情况返回None,例如 x match { case A(a) = Some(a) case B(b) = Some(b) case _ = None} 我可以想象使用它来简化这个 object MaybeMatchImplicits { implicit class MaybeMatcher[A](val underlying: A)
我发现自己经常使用模式匹配来返回一个选项,其中无匹配情况返回None,例如

x match {
    case A(a) => Some(a)
    case B(b) => Some(b)
    case _ => None
}

我可以想象使用它来简化这个

object MaybeMatchImplicits {
    implicit class MaybeMatcher[A](val underlying: A) extends AnyVal {
        @inline 
        def maybeMatch[B](f: PartialFunction[A,B]): Option[B] = f.lift.apply(underlying)
    }
}

这使得

scala> import MaybeMatchImplicits._
import MaybeMatchImplicits._

scala> 5 maybeMatch { case 5 => 'good }
res0: Option[Symbol] = Some('good)

scala> 6 maybeMatch { case 5 => 'good }
res1: Option[Symbol] = None

我想知道这种方法是否隐藏任何陷阱和/或在Scala 2.11中是否有更简单/更好/更惯用的机制.

更新:目标是处理匹配的rhs上的任意计算,这使得基于异常的解决方案不合需要.

解决方法

成语:

scala> case class A(a: Int) ; case class B(b: String)
defined class A
defined class B

scala> def f(x: Any) = Option(x) collect { case A(a) => a ; case B(b) => b }
f: (x: Any)Option[Any]

scala> f(42)
res0: Option[Any] = None

scala> f(A(42))
res1: Option[Any] = Some(42)

scala> f(B("ok"))
res2: Option[Any] = Some(ok)

或者:

scala> import PartialFunction.{cond => when,condOpt => whenever}
import PartialFunction.{cond=>when,condOpt=>whenever}

scala> def f(x: Any) = whenever(x) { case A(a) => a ; case B(b) => b }
f: (x: Any)Option[Any]

scala> f(42)
res3: Option[Any] = None

scala> f(A(42))
res4: Option[Any] = Some(42)

scala> f(B("ok"))
res5: Option[Any] = Some(ok)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读