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

Scala模式匹配:参数化的提取器对象是否可能?

发布时间:2020-12-16 19:13:24 所属栏目:安全 来源:网络整理
导读:是否可以创建可以使用的Extractor对象,例如: val x = 42x match { case GreaterThan(80) = println("5") case GreaterThan(70) = println("4") case GreaterThan(60) = println("3") case GreaterThan(40) = println("2") case _ = println("1")} 现在我知
是否可以创建可以使用的Extractor对象,例如:

val x = 42

x match {
  case GreaterThan(80) => println("5")
  case GreaterThan(70) => println("4")
  case GreaterThan(60) => println("3")
  case GreaterThan(40) => println("2")
  case _ => println("1")
}

现在我知道if结构是可能的,但是我觉得它使我的代码混乱(并且看起来多余:例如,如果MyCreteria(x)=> _,则为MyMatcher(x)),我想避免这种情况.

解决方法

case语句中使用的Extractor对象需要具有unapply方法.不幸的是,由于对象本身就是单例,因此无法创建这样的参数化对象(afaik).

在下面的代码中我绕过了这个为每个限制创建特定的单例对象.

@ákosVandra:也许以下代码是有用的(因为它最接近您的要求):

def main(args: Array[String]) : Unit = {
  val n = 42

  n match {
    case GreaterThan50(x) => println("5")
    case GreaterThan40(x) => println("4")
    case GreaterThan30(x) => println("3")
    case GreaterThan20(x) => println("2")
    case _ => println("somewhat")
  }
}

class GreaterThanLimit(val limit: Int) {
  def unapply(x: Int): Option[Int] = if (x > limit) Some(x) else None
}

object GreaterThan10 extends GreaterThanLimit(10)
object GreaterThan20 extends GreaterThanLimit(20)
object GreaterThan30 extends GreaterThanLimit(30)
object GreaterThan40 extends GreaterThanLimit(40)
object GreaterThan50 extends GreaterThanLimit(50)

编辑2015-09-17

根据ákosVandra的评论,可以使用布尔而不是选项[_]来编写

def main(args: Array[String]) : Unit = {
  val n = 42

  n match {
    case GreaterThan50() => println("5")
    case GreaterThan40() => println("4")
    case GreaterThan30() => println("3")
    case GreaterThan20() => println("2")
    case _ => println("somewhat")
  }
}

class GreaterThanLimit(val limit: Int) {
  def unapply(x: Int) : Boolean = x > limit
}

object GreaterThan10 extends GreaterThanLimit(10)
object GreaterThan20 extends GreaterThanLimit(20)
object GreaterThan30 extends GreaterThanLimit(30)
object GreaterThan40 extends GreaterThanLimit(40)
object GreaterThan50 extends GreaterThanLimit(50)

(编辑:李大同)

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

    推荐文章
      热点阅读