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

在scala模式匹配中,什么是可变模式的可疑阴影?,scala,intellij-idea,Scala,Intellij Idea,当我在Intellij中键入以下代码时,它会高亮显示匹配中的x,并警告“变量模式的可疑阴影” 建议我将其改为: val x = "some value" "test" match { case `x` => //note backticks } 什么是可疑的阴影?背虱是干什么的 case x 创建一个名为x的变量,该变量将匹配所有内容,并且由于已经存在同名变量,因此可以使用相同的名称对其进行阴影处理 case `x` 使用之前声明的变量x的值,该值仅与具有相同值的输入匹配 PS

当我在Intellij中键入以下代码时,它会高亮显示匹配中的x,并警告“变量模式的可疑阴影”

建议我将其改为:

val x = "some value"
"test" match {
  case `x` => //note backticks
}
什么是可疑的阴影?背虱是干什么的

case x
创建一个名为
x
的变量,该变量将匹配所有内容,并且由于已经存在同名变量,因此可以使用相同的名称对其进行阴影处理

case `x`
使用之前声明的变量
x
的值,该值仅与具有相同值的输入匹配

PS

如果变量名称如中所示大写,则可以保留背面的勾号

case Pi

更多信息,请关注。

Scala编程[1]节选:

文字标识符是一个任意字符串,包含在反刻度
(`…`)
中。文字标识符的一些示例包括:

    `x` `<clinit>` `yield`
`x``yield`
其思想是,您可以将运行时接受的任何字符串作为标识符放在两个回标记之间。结果总是一个Scala标识符。即使后面的记号中包含的名称是Scala保留字,这种方法仍然有效。一个典型的用例是访问Java的
Thread
类中的静态
yield
方法。无法写入
Thread.yield()
,因为
yield
是Scala中的保留字。但是,您仍然可以在背面标记中命名该方法,例如,
Thread.`yield`()

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


[1] M.Odersky,L.Spoon,B.Venners,《Scala编程》,第二版,胡桃溪:Artima出版社2010年,第109页,匹配内的案例生成一个新符号
x
,以接收匹配值。这是因为,按照惯例,小写标识符将引用值,大写标识符将引用类型

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

它将此标记为可疑,因为此跟踪通常是无意的,在您的示例中似乎确实如此

关于反勾号,请参见以下示例: 不过,它们看起来并不是一个好的解决方案。最好选择一个不同的名字

    `x` `<clinit>` `yield`