gpt4 book ai didi

Scala:我们可以在密封的案例类声明中预先将保护条件与模式匹配结合起来吗

转载 作者:行者123 更新时间:2023-12-04 12:23:14 26 4
gpt4 key购买 nike

是否可以在密封的案例类声明中将保护条件与模式匹配结合起来?

我意识到在匹配块中包含保护条件是可能的,但我觉得在密封的案例类中预先定义这个条件是有益的。
这将允许开发人员定义一组严格的可能输入,编译器将在模式匹配时检查这些输入。

所以总而言之,我希望能够做这样的事情:

// create a set of pattern matchable cases with guards built in

sealed abstract class Args
case class ValidArgs1(arg1:Int,arg2:Int) if arg1>1 && arg2<10 extends Args
case class ValidArgs2(arg1:Int,arg2:Int) if arg1>5 && arg2<6 extends Args
case class InvalidArgs(arg1:Int,arg2:Int) if arg1<=1 && arg2>=10 extends Args


// the aim of this is to achieve pattern matching against an exhaustive set of
// pre-defined possibilities

def process(args:Args){
args match
{
case ValidArgs1 = > // do this
case ValidArgs2= > // do this
case InvalidArgs = > // do this
}
}

最佳答案

+1 一个有趣的推测性问题。由于您不是在类型级别进行操作,因此您无法在编译时验证实例化,除非使用宏进行非常特殊的检查,例如当您将文字传递给构造函数时。

另一方面,您的场景,即模式匹配,是一个运行时操作。为此,您可以使用提取器而不是案例类。

case class Args(arg1: Int, arg2: Int)
object ValidArgs1 {
def apply(arg1: Int, arg2: Int): Args = {
val res = Args(arg1, arg2)
require(unapply(res))
res
}
def unapply(args: Args): Boolean = args.arg1 > 1 && args.arg2 < 10
}

def process(args: Args) = args match {
case ValidArgs1() => "ok"
case _ => "invalid"
}

process(ValidArgs1(2, 9))
process(Args(1, 10))
process(Args(3, 4))

关于Scala:我们可以在密封的案例类声明中预先将保护条件与模式匹配结合起来吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11914556/

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