`@` оператор с Scala Cats Validated [дубликат]

Получение как stdout, так и stderr (а также запись в stdin, не показано здесь) легко peasy с моим заголовком pstreams , который определяет классы iostream, которые работают как popen:

#include 
#include 
#include 

int main()
{
  // run a process and create a streambuf that reads its stdout and stderr
  redi::ipstream proc("./some_command", redi::pstreams::pstdout | redi::pstreams::pstderr);
  std::string line;
  // read child's stdout
  while (std::getline(proc.out(), line))
    std::cout << "stdout: " << line << '\n';
  // read child's stderr
  while (std::getline(proc.err(), line))
    std::cout << "stderr: " << line << '\n';
} 

106
задан Peter Mortensen 10 May 2013 в 09: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 =>
}

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

150
ответ дан Daniel C. Sobral 17 August 2018 в 21:02
поделиться
  • 1
    Где в документации я найду ответ? У меня такое чувство, что там тоже хорошие вещи. :) – Jim Barrows 2 March 2010 в 23:47
  • 2
    @Jim Scala Reference, 8.1. 8.12, в частности, хотя я не знаю, где «как обычно» из них - и 8.12 говорят только о шаблоне регулярного выражения (_*). Но, возможно, это было выяснено в более новой версии спецификации. – Daniel C. Sobral 2 March 2010 в 23:58
  • 3
    Я бы добавил, что вы, вероятно, не будете использовать @ с Some(_), но, если вы хотите совместить содержимое Some, но все равно обращаетесь к самому Some, например. case x @ Some(7) => println(x). Как я его интерпретирую case x @ Some(_), это всего лишь более подробная версия case x: Some. – Theo 3 March 2010 в 14:22
  • 4
    Это также рассматривается в разделе «Переменное связывание». в разделе 15.2 «Программирование в Scala - 2nd Edition» и снова используется в разделе 26.3 (глава об экстракторах). – Shaun the Sheep 18 September 2011 в 21:46
  • 5
    @Theo case x: Some не работает сам по себе. Вы должны использовать case x: Some[_], который не менее подробный – Luigi Plinge 25 October 2011 в 20:47

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

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) }
8
ответ дан Mitch Blevins 17 August 2018 в 21:02
поделиться

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

2
ответ дан oxbow_lakes 17 August 2018 в 21:02
поделиться
  • 1
    Проклятье неспособность iPhone сделать обратную линию! – oxbow_lakes 1 March 2010 в 23:23

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

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)
62
ответ дан retronym 17 August 2018 в 21:02
поделиться

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

9
ответ дан sepp2k 17 August 2018 в 21:02
поделиться
Другие вопросы по тегам:

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