Scala:匹配元组:无法访问的代码

时间:2014-05-28 13:56:01

标签: scala pattern-matching

任务:给定一个元素从2元素元组中获取另一个元素。为什么这段代码失败了:

 def neighbor(vertice:String, key:(String, String)):String = key match {
    case (vertice,x) => x
    case (x,vertice) => x //unreachable code??
  }

运行:

   println(neighbor("foo",("foo","bar")))
   println(neighbor("foo",("bar","foo")))

返回:

bar
foo

如何使这项工作?为什么第二个case无法访问?

3 个答案:

答案 0 :(得分:4)

试试这个:

def neighbor(vertice:String, key:(String, String)):String = key match {
  case (`vertice`,x) => x
  case (x,`vertice`) => x //unreachable code??
}

或使用大写字母V的Vertice。否则模式匹配会认为您只是指任何值。这就是为什么在这种情况下你会得到无法访问的代码错误。这是一个ideOne

答案 1 :(得分:1)

我不确切地知道您的期望,但您编写的代码很可能不会按照您的想法执行。我猜你认为如果元组的第一个元素等于传递给方法的case变量,第一个vertice将匹配,第二个case会如果元组的第二个元素等于vertice参数,则匹配。

如果这就是你想要的,那就这样写:

def neighbor(vertice:String, key:(String, String)):String = key match {
  case (left, x) if left == vertice => x
  case (x, right) if right == vertice => x
}

答案 2 :(得分:1)

比我更聪明的人会确认/纠正我,但我相当确定你的两个案件完全相同。在案例中声明的名称是新变量,在您的情况下,它们会影响您的方法参数。

我认为您的代码严格等同于:

def neighbor(vertice:String, key:(String, String)):String = key match {
  case (a,b) => b
  case (a,b) => a //unreachable code!!
}

这样写,你的第二种情况更难以触及,不是吗?