Scala要求模式变量是线性的,即模式 变量在模式中可能不会出现多次。因此,此示例不编译:
def tupleTest(tuple: (Int, Int)) = tuple match {
case (a, a) => a
case _ => -1
}
但你可以使用两个模式变量和一个后卫来检查相等性:
def tupleTest(tuple: (Int, Int)) = tuple match {
case (a, b) if a == b => a
case _ => -1
}
那么为什么Scala要求模式变量是线性的?是否有任何不能像这样转变的案例?
很容易将第一个示例转换为第二个示例(Scala转换为Scala)。在模式中出现的所有变量v
中,首先获取被计算的表达式并将其分配给变量v
。对于每个其他事件,引入一个名称未在当前范围中使用的新变量。对于每个变量v'
,添加一个后卫v == v'
。它与程序员的行为方式相同(=>效率相同)。这种方法有什么问题吗?我希望看到一个无法像这样转变的例子。
答案 0 :(得分:0)
因为case (a, b)
基本上将val a
分配给_._1
而val b
分配给_._2
(至少您可以这样查看)。如果是case (a, a)
,则无法将val a
分配给_._1
和_._2
。
实际上你想做的事情看起来像是
case (a, `a`) => ???
因为scala使用反引号来匹配标识符。但遗憾的是,由于仅在a
之后才给出=>
的可见性,但仍然不起作用(虽然会很有趣,但我也讨厌写case (a, b) if a = b =>
)。其原因可能仅仅是因为编写支持