Scala의 @ 연산자는 무엇을합니까?
예를 들어, 블로그 게시물 스칼라의 공식 언어 처리, Part 2 에는 이와 같은 것이 있습니다.
case x @ Some(Nil) => x
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 =>
}
참고 @
로 사용할 수 있습니다 있는 일치의 최상위 수준에서뿐만 아니라, 수준.
_*
) 만 말합니다 . 그러나 이것은 최신 버전의 사양에서 명확 해졌습니다.
@
와 함께 사용하지 않을 Some(_)
것이 아니라 오히려의 내용과 일치시키고 Some
싶지만 여전히 Some 자체를 참조하려는 경우에 추가 할 것입니다 case x @ Some(7) => println(x)
. 내가 해석하는 것처럼 그것은 case x @ Some(_)
더 장황한 버전입니다 case x: Some
.
case x: Some
는 저절로 작동하지 않습니다. 당신은 case x: Some[_]
덜 장황한 을 사용해야합니다
@
성공적으로 일치하는 패턴 또는 하위 패턴에 이름을 바인딩하는 데 사용할 수 있습니다. 패턴은 패턴 매칭, <-
이해를위한 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)
패턴의 최상위와 일치시킬 수 있습니다. 예:
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 )