在scala模式匹配中,什么是可变模式的可疑阴影?
当我在Intellij中键入以下代码时,它会高亮显示匹配中的x,并警告“变量模式的可疑阴影” 建议我将其改为:在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
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`