任务:给定一个元素从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
无法访问?
答案 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!!
}
这样写,你的第二种情况更难以触及,不是吗?