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

Noe*_*edy 30 scala intellij-idea

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

val x = "some value"
"test" match {
  case x =>
}
Run Code Online (Sandbox Code Playgroud)

它建议我将其更改为:

val x = "some value"
"test" match {
  case `x` => //note backticks
}
Run Code Online (Sandbox Code Playgroud)

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

agi*_*eel 40

case x
Run Code Online (Sandbox Code Playgroud)

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

case `x`
Run Code Online (Sandbox Code Playgroud)

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

PS

如果变量的名称大写为,则可以保留后面的滴答声

case Pi
Run Code Online (Sandbox Code Playgroud)

观看模式匹配释放更多.


Swi*_*iss 7

Scala编程摘录[1]:

文字标识符是封闭在背面蜱的任意字符串(`...`).文字标识符的一些示例是:

    `x` `<clinit>` `yield`
Run Code Online (Sandbox Code Playgroud)

我们的想法是,您可以将运行时接受的任何字符串作为后标记之间的标识符.结果始终是Scala标识符.即使后面的刻度中包含的名称是Scala保留字,这也可以工作.一个典型的用例是访问yieldJava 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


Gre*_*idt 5

匹配中的大小写会生成一个新符号x来接收匹配的值。这是因为按照惯例,期望小写标识符表示值,而大写标识符表示类型。

因此,case语句将生成一个x与您的初始值同名的新符号,“遮盖”原始值。“遮蔽” IntelliJ表示它隐藏了相同名称的任何其他值,从而使它们不可访问。

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

关于反引号,请参见此处:例如,需要对Scala文字标识符(反引号) 进行说明,但是它们似乎并不是一个好的解决方案。最好选择其他名称。