繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM