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) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |