Что делает оператор @ в Scala?
Например, в сообщении блога « Обработка формального языка в Scala, часть 2» есть что-то вроде этого
case x @ Some(Nil) => x
Что делает оператор @ в Scala?
Например, в сообщении блога « Обработка формального языка в Scala, часть 2» есть что-то вроде этого
case x @ Some(Nil) => x
Это позволяет привязать согласованный шаблон к переменной. Рассмотрим, например, следующее:
val o: Option[Int] = Some(2)
Вы можете легко извлечь содержимое:
o match {
case Some(x) => println(x)
case None =>
}
Но что , если вы хотите , а не содержание от Some
, но самого варианта? Этого можно достичь с помощью этого:
o match {
case x @ Some(_) => println(x)
case None =>
}
Обратите внимание, что @
можно использовать на любом уровне, а не только на верхнем уровне сопоставления.
_*
). Но, возможно, это было уточнено в более новой версии спецификации.@
withSome(_)
, а, скорее, если бы вы хотели сопоставить содержимоеSome
, но все же ссылаться на сам Some, напримерcase x @ Some(7) => println(x)
. Как я понимаю, этоcase x @ Some(_)
просто более подробная версияcase x: Some
.case x: Some
не работает сам по себе. Вы должны использоватьcase x: Some[_]
, что не менее многословно,@
может использоваться для привязки имени к успешно подобранному шаблону или подшаблону. Шаблоны могут использоваться для сопоставления с образцом, левой части<-
in для понимания и для деструктурирования заданий.источник
Когда сопоставление с образцом
variable @ pattern
связывает переменную со значением, совпадающим с образцом, если образец совпадает. В данном случае это означает, что значениеx
будетSome(Nil)
в этом case-clause.источник
Позволяет сопоставить верхний уровень рисунка. Пример:
источник
Он устанавливает значение
x
соответствующего шаблона. В вашем примере,x
следовательно, будетSome(Nil)
(как вы могли определить по вызову println )источник