[英]In scala pattern matching, what is suspicious shadowing by a variable pattern?
当我在Intellij中键入以下代码时,它会突出显示匹配中的x,并显示警告“可变模式的可疑阴影”
val x = "some value"
"test" match {
case 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`
我们的想法是,您可以将运行时接受的任何字符串作为后标记之间的标识符。 结果始终是Scala标识符。 即使后面的刻度中包含的名称是Scala保留字,这也可以工作。 一个典型的用例是访问Java的
Thread
类中的静态yield
方法。 你不能写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
匹配内的情况生成新符号x
以接收匹配值。 这是因为,按照惯例,期望小写标识符将值和大写标识符引用到类型。
因此case语句生成一个与您的初始值同名的新符号x
,“遮蔽”该原始值。 通过“阴影”IntelliJ意味着它隐藏了任何其他同名的值,从而使它们无法访问。
它将此标记为可疑,因为这种阴影通常是无意的,因为在您的示例中确实如此。
关于反引号,请参见例如: 需要澄清Scala文字标识符(反引号)但它们看起来并不是一个好的解决方案。 最好选择一个不同的名字。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.