作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
是否可以在密封的案例类声明中将保护条件与模式匹配结合起来?
我意识到在匹配块中包含保护条件是可能的,但我觉得在密封的案例类中预先定义这个条件是有益的。
这将允许开发人员定义一组严格的可能输入,编译器将在模式匹配时检查这些输入。
所以总而言之,我希望能够做这样的事情:
// 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/
问了这个问题How to reach CSS zen? ,我现在明白我遇到的问题大多与定位有关。我发现一些文章说 CSS 作为布局系统并不总是足够好。 http://echochamber.me/vi
我是一名优秀的程序员,十分优秀!