Scala의 @ 연산자는 무엇을합니까?
예를 들어, 블로그 게시물 스칼라의 공식 언어 처리, Part 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 =>
}
참고 @
로 사용할 수 있습니다 있는 일치의 최상위 수준에서뿐만 아니라, 수준.
답변
@
성공적으로 일치하는 패턴 또는 하위 패턴에 이름을 바인딩하는 데 사용할 수 있습니다. 패턴은 패턴 매칭, <-
이해를위한 in 의 왼쪽 , 파괴적인 어설 션에 사용될 수 있습니다 .
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)
답변
패턴 매칭을 할 때 variable @ pattern
결합 변수를 일치 값 무늬 패턴과 일치하는 경우. 이때 수단의 값에 해당한다는 x
것이다 Some(Nil)
경우 절에서.
답변
패턴의 최상위와 일치시킬 수 있습니다. 예:
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) }
답변
x
일치하는 패턴으로 값을 설정합니다 . 당신의 예에서, x
그러므로 것 Some(Nil)
(당신에 대한 호출에서 결정할 수로 에 println )