为什么替代模式中不允许使用变量?

时间:2011-07-03 08:20:07

标签: scala pattern-matching

通常你会有“对称”的匹配,并希望写出如下内容:

def g(p:(Int,Int)) = p match {
  case (10,n) | (n,10) => println(n)
  case _ => println("nope")
}

这是不允许的,但是如果每个替换相同的变量相同的类型,这应该不是问题,因为它可以被转换为单独的例:

def g(p:(Int,Int)) = p match {
  case (10,n) => println(n)
  case (n,10) => println(n)
  case _ => println("nope")
}

那么为什么我们有这个限制?

2 个答案:

答案 0 :(得分:21)

可能因为需要一些时间来实施,而且时间更好地花在其他地方。它还会不必要地增加语言及其编译器的复杂性。正如您已经提到的,可以轻松避免这个问题。避免此问题的另一种方法是编写自定义提取器:

object ThisOrThat {
  def unapply(p:(Int,Int)):Option[Int] = p match {
    case (10, n) => Some(n)
    case (n, 10) => Some(n)
    case _ => None
  }
}

答案 1 :(得分:0)

听起来实施起来会很乏味......从后面开始有一个feature suggestion

显而易见的解决方法是为结果定义一个函数,并从单独的case调用它(对于简单的模式更好),或者为Kim替代模式定义一个自定义提取器(更好)当它嵌套在一个模式中时,你宁愿不必重复。)

无论哪种方式,它都会比语言支持更冗长,更难阅读,所以希望有人最终会实现它。