在scala模式匹配中,可变模式的可疑阴影是什么?

时间:2011-10-26 15:29:50

标签: scala intellij-idea

当我在Intellij中输入以下代码时,会突出显示匹配中的x,并显示警告“可变模式的可疑阴影”

val x = "some value"
"test" match {
  case x =>
}

它建议我将其更改为:

val x = "some value"
"test" match {
  case `x` => //note backticks
}

什么是可疑的阴影以及反对做什么?!

3 个答案:

答案 0 :(得分:39)

case x

创建一个名为x的变量,该变量将匹配所有内容,并且由于已存在具有相同名称的变量,因此使用相同的名称对其进行遮蔽。

case `x`

使用之前声明的变量x的值,并且只匹配具有相同值的输入。

PS

如果变量的名称大写为

,则可以留下后面的滴答声
case Pi

观看Pattern Matching Unleashed了解更多信息。

答案 1 :(得分:7)

Scala编程摘录[1]:

  

文字标识符是一个包含在后面标记(`...`)中的任意字符串。文字标识符的一些示例是:

  
    `x` `<clinit>` `yield`
  

我们的想法是,您可以将运行时接受的任何字符串作为后标记之间的标识符。结果始终是Scala标识符。即使后面的刻度中包含的名称是Scala保留字,这也可以工作。典型的用例是访问Java的yield类中的静态Thread方法。您无法编写Thread.yield(),因为yield是Scala中的保留字。但是,您仍然可以在后面的刻度中命名该方法,例如 Thread.`yield`()

简而言之,`x`x的值匹配。使用x,您将创建一个匹配任何内容的新变量,并将结果保存到x

[1] M. Odersky,L。Spoon,B。Venners, Programming in Scala ,2nd ed,Walnut Creek:Artima Press 2010,pp.109 http://www.artima.com/pins1ed/functional-objects.html#i1517246665-1

答案 2 :(得分:4)

匹配内的情况会生成一个新符号x以接收匹配的值。这是因为,按照惯例,预期小写标识符将值和大写标识符引用到类型。

因此case语句生成一个与您的初始值相同的新名称x,“遮蔽”该原始值。通过“阴影”IntelliJ意味着它隐藏了任何其他同名的值,从而使它们无法访问。

它将此标记为可疑,因为这种阴影通常是无意的,因为在您的示例中确实如此。

关于反引号,请参阅例如在这里:Need clarification on Scala literal identifiers (backticks) 但是,它们似乎并不是一个好的解决方案。最好选择一个不同的名字。