[scala] 스칼라 @ 연산자

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 )


답변