Scala模式匹配:参数化的提取器对象是否可能?

Á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) => _,我想避免这种情况.

Mar*_*nne 1

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

\n\n

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

\n\n

@\xc3\x81kos Vandra:也许下面的代码很有帮助(因为它最接近您的要求):

\n\n
def 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)\n
Run Code Online (Sandbox Code Playgroud)\n\n

编辑2015-09-17

\n\n

根据 \xc3\x81kos Vandra\ 的评论的想法,可以使用Boolean代替Option[_]并写

\n\n
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)\n
Run Code Online (Sandbox Code Playgroud)\n