当我在Intellij中输入以下代码时,会突出显示匹配中的x,并显示警告“可变模式的可疑阴影”
val x = "some value"
"test" match {
case x =>
}
它建议我将其更改为:
val x = "some value"
"test" match {
case `x` => //note backticks
}
什么是可疑的阴影以及反对做什么?!
答案 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) 但是,它们似乎并不是一个好的解决方案。最好选择一个不同的名字。