Áko*_*dra 7 scala pattern-matching
是否可以创建可以使用的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")
}
Run Code Online (Sandbox Code Playgroud)
现在我知道if if构造是可能的,但我觉得它使我的代码混乱(并且看起来多余了:) case MyMatcher(x) if MyCreteria(x) => _,我想避免这种情况.
语句中使用的提取器对象case需要有一个unapply方法。不幸的是,由于对象本身是单例,所以没有办法(据我所知)来创建这样的参数化对象。
在下面的代码中,我通过object为每个限制创建特定的 singleton 来规避这个问题。
@\xc3\x81kos Vandra:也许下面的代码很有帮助(因为它最接近您的要求):
\n\ndef main(args: Array[String]) : Unit = {\n val n = 42\n\n n match {\n case GreaterThan50(x) => println("5")\n case GreaterThan40(x) => println("4")\n case GreaterThan30(x) => println("3")\n case GreaterThan20(x) => println("2")\n case _ => println("somewhat")\n }\n}\n\nclass GreaterThanLimit(val limit: Int) {\n def unapply(x: Int): Option[Int] = if (x > limit) Some(x) else None\n}\n\nobject GreaterThan10 extends GreaterThanLimit(10)\nobject GreaterThan20 extends GreaterThanLimit(20)\nobject GreaterThan30 extends GreaterThanLimit(30)\nobject GreaterThan40 extends GreaterThanLimit(40)\nobject GreaterThan50 extends GreaterThanLimit(50)\nRun Code Online (Sandbox Code Playgroud)\n\n根据 \xc3\x81kos Vandra\ 的评论的想法,可以使用Boolean代替Option[_]并写
def main(args: Array[String]) : Unit = {\n val n = 42\n\n n match {\n case GreaterThan50() => println("5")\n case GreaterThan40() => println("4")\n case GreaterThan30() => println("3")\n case GreaterThan20() => println("2")\n case _ => println("somewhat")\n }\n}\n\nclass GreaterThanLimit(val limit: Int) {\n def unapply(x: Int) : Boolean = x > limit\n}\n\nobject GreaterThan10 extends GreaterThanLimit(10)\nobject GreaterThan20 extends GreaterThanLimit(20)\nobject GreaterThan30 extends GreaterThanLimit(30)\nobject GreaterThan40 extends GreaterThanLimit(40)\nobject GreaterThan50 extends GreaterThanLimit(50)\nRun Code Online (Sandbox Code Playgroud)\n