gpt4 book ai didi

Scala模式匹配: Are parametrized extractor objects possible?

转载 作者:行者123 更新时间:2023-12-02 17:30:46 26 4
gpt4 key购买 nike

是否可以创建一个可以使用的 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 构造是可能的,但我觉得它使我的代码变得困惑(并且似乎多余: case MyMatcher(x) if MyCreteria(x) => _ ),我想避免这种情况。

最佳答案

case 语句中使用的提取器对象需要具有 unapply 方法。不幸的是,由于对象本身是单例,因此没有办法(据我所知)来创建这样的参数化对象。

在下面的代码中,我通过为每个限制创建特定的单例对象来规避这个问题。

@Ákos Vandra:也许以下代码很有帮助(因为它最接近您的要求):

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

根据 Ákos Vandra 评论中的想法,可以使用 Boolean 而不是 Option[_] 并编写

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)

关于Scala模式匹配: Are parametrized extractor objects possible?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32604098/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com