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

标签 scala

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

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

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

// 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/

相关文章:

java - sbt添加java项目

scala - Akka 流保持空闲状态而不是抛出异常

scala - 如何在 Scalatest 中访问配置映射值?

Scala - 在包含未实现变量的 Trait 中使用字符串插值

scala - Scala 有没有办法拥有动态数量的命名/类型参数?

scala - 使用静态 Nat HList 压缩通用 HList

scala - 将大文件写入 S3 的最佳方法是什么?

scala - 使用键入的键 Play Framework 请求属性

scala - 在可变 TreeSet 上调用 from/until/range 两次导致空序列

scala - 如何通过谓词将序列分成两部分?