Scala @ оператор

Чтобы объявить свойство переменной типа, пометьте объявление с помощью модификатора объявления static. Классы могут отмечать присвоенные значения свойства с помощью модификатора объявления class вместо этого, чтобы позволить подклассам переопределять реализацию суперкласса. Свойства типа обсуждаются в свойствах типа.

ПРИМЕЧАНИЕ В объявлении класса ключевое слово static имеет тот же эффект, что и обозначение объявления как с помощью class и final.

blockquote> blockquote>

Источник: Язык Swift для программирования - Свойства переменной типа

124
задан Peter Mortensen 10 May 2013 в 08:13
поделиться

5 ответов

Он позволяет привязать согласованный шаблон к переменной. Рассмотрим, например, следующее:

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 =>
}

Обратите внимание, что @ может использоваться на любом уровне , а не только на верхнем уровне сопоставления.

172
ответ дан 24 November 2019 в 00:59
поделиться

Позволяет сопоставить верхний уровень шаблона. Пример:

case x @ "three" => assert(x.equals("three"))
case x @ Some("three") => assert(x.get.equals("three")))
case x @ List("one", "two", "three") => for (element <- x) { println(element) }
9
ответ дан 24 November 2019 в 00:59
поделиться

@ можно использовать для привязки имени к успешно сопоставленному шаблону или подшаблону. Шаблоны могут использоваться для сопоставления с образцом, левая часть <- для понимания и для деструктурирования заданий.

scala> val d@(c@Some(a), Some(b)) = (Some(1), Some(2))
d: (Some[Int], Some[Int]) = (Some(1),Some(2))
c: Some[Int] = Some(1)
a: Int = 1
b: Int = 2

scala> (Some(1), Some(2)) match { case d@(c@Some(a), Some(b)) => println(a, b, c, d) }
(1,2,Some(1),(Some(1),Some(2)))

scala> for (x@Some(y) <- Seq(None, Some(1))) println(x, y)
(Some(1),1)

scala> val List(x, xs @ _*) = List(1, 2, 3) 
x: Int = 1
xs: Seq[Int] = List(2, 3)
70
ответ дан 24 November 2019 в 00:59
поделиться

Устанавливает значение x в соответствии с шаблоном. В вашем примере x , следовательно, будет Some (Nil) (как вы могли определить по вызову println )

2
ответ дан 24 November 2019 в 00:59
поделиться

При сопоставлении с шаблоном переменная @ шаблон связывает переменную со значением, сопоставленным шаблоном, если шаблон совпадает. В данном случае это означает, что значением x будет Some(Nil) в этом case-клаузе.

9
ответ дан 24 November 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: