Что такое подозрительное теневое копирование в шаблоне переменных при сопоставлении с шаблоном scala? - PullRequest
29 голосов
/ 26 октября 2011

Когда я набираю следующий код в Intellij, он подсвечивает x внутри совпадения с предупреждением «Подозрительное затенение по шаблону переменной»

val x = "some value"
"test" match {
  case x =>
}

Это предполагает, что я изменил его на:

val x = "some value"
"test" match {
  case `x` => //note backticks
}

Что такое подозрительное отслеживание и что делают обратные помехи?!

Ответы [ 3 ]

40 голосов
/ 26 октября 2011
case x

создает переменную с именем x, которая будет соответствовать всему, и поскольку переменная с таким именем уже существует, вы замаскируете ее, используя то же имя.

case `x`

использует значение переменной x, которое было объявлено ранее, и будет соответствовать входам только с теми же значениями.

PS

Вы можете оставить галочку, если имя переменной написано с большой буквы, как в

case Pi

Часы Сопоставление с шаблоном Unleashed для более.

7 голосов
/ 26 октября 2011

Отрывок из программирования в Scala [1]:

A буквенный идентификатор - произвольная строка, заключенная в обратные галочки (`...`). Некоторые примеры литеральных идентификаторов:

    `x` `<clinit>` `yield`

Идея состоит в том, что вы можете поместить любую строку, принятую средой выполнения, в качестве идентификатора между обратными тиками. Результатом всегда является идентификатор Scala. Это работает, даже если имя, содержащееся в обратных тиках, будет зарезервированным словом Scala. Типичный пример использования - доступ к статическому методу yield в классе Java Thread. Вы не можете написать Thread.yield(), потому что yield является зарезервированным словом в Scala. Тем не менее, вы все равно можете назвать метод в обратном тике, например, Thread.`yield`().

Короче говоря, с `x` вы соответствуете значению x. С x вы создаете новую переменную, которая будет соответствовать чему угодно и сохраните результат в x.

[1] М. Одерский, Л. Спун, Б. Веннерс, Программирование в Scala , 2-е издание, Уолнат-Крик: Artima Press 2010, с. 109 http://www.artima.com/pins1ed/functional-objects.html#i1517246665-1

4 голосов
/ 26 октября 2011

Регистр внутри совпадения генерирует новый символ x для получения сопоставленного значения. Это связано с тем, что условно идентификаторы нижнего регистра должны ссылаться на значения, а идентификаторы верхнего регистра - на типы.

Таким образом, оператор case генерирует новый символ с тем же именем x, что и ваше начальное значение, "затеняя" это исходное значение. «Затенение» IntelliJ означает, что он скрывает любые другие значения с тем же именем и, таким образом, делает их недоступными.

Это помечает это как подозрительное, потому что это затенение часто непреднамеренно, как, кажется, действительно имеет место в вашем примере.

Что касается обратных галочек, см., Например, здесь: Требуются пояснения по буквальным идентификаторам Scala (обратные метки) Тем не менее, они не кажутся хорошим решением. Лучше выбрать другое имя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...