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

Scala – 提取器无法应用混乱

发布时间:2020-12-16 19:21:43 所属栏目:安全 来源:网络整理
导读:我正在尝试编写一个提取器,用于匹配多参数案例类.简化示例: case class X(p1: String,p2: Int) 我希望每个提取器对象为p1定义一个固定值,并在使用时定义p2. (A,B等不能是case类和子类X,我也想用X(,)作为例子) 应用方法示例: object A { def apply(p2: Int)
我正在尝试编写一个提取器,用于匹配多参数案例类.简化示例:

case class X(p1: String,p2: Int)

我希望每个提取器对象为p1定义一个固定值,并在使用时定义p2. (A,B等不能是case类和子类X,我也想用X(,)作为例子)
应用方法示例:

object A {
  def apply(p2: Int): X = X("A",p2)
}

object B {
  def apply(p2: Int): X = X("B",p2)
}

...

对于模式匹配,我希望它们匹配如下:

X("A",2) match {
  case A(2) => true // <- should match: p1="A" and p2=2
  case A(_) => true // <- should match: p1="A" and p2=_
  case X("A",_) => true // <- should match: p1="A" and p2=_
  case A(1) => false // <- should not match
  case B(2) => false // <- should not match: p1="B" and p2=2
}

我知道我需要在A,B等中定义unapply方法,但我完全混淆了签名和逻辑应该是什么:

object A {
  def unapply(x: ???): Option[???] = {
    ???
  } 
}

请帮忙吗?

解决方法

unapply接受Any并返回一个你想要提取的选项.在你的情况下,这将是:

scala> case class X(p1: String,p2: Int)
defined class X

scala> object A {
     |   def unapply(target: Any): Option[Int] =
     |     PartialFunction.condOpt(target) {
     |       case X("A",p2) => p2
     |     }
     | }
defined module A

scala> val A(x) = X("A",1)
x: Int = 1

scala> val A(x) = X("B",1)
scala.MatchError: X(B,1) (of class X)
...

但说实话,你提出的例子可以在没有A和B的情况下重写:

X("A",2) match {
  case X("A",2) => true
  case X("A",1) => false
  case X("A",_) => true
  case X("B",2) => false
}

(编辑:李大同)

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

    推荐文章
      热点阅读