스칼라 @ 연산자


답변:


179

일치하는 패턴을 변수에 바인딩 할 수 있습니다. 예를 들어 다음을 고려하십시오.

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

참고 @로 사용할 수 있습니다 있는 일치의 최상위 수준에서뿐만 아니라, 수준.


5
문서에서 그 대답을 어디에서 찾을 수 있습니까? 거기에 다른 좋은 물건들이 묻혀있는 느낌이 듭니다. :)
Jim Barrows 22.47에

1
@Jim Scala Reference, 8.1. 8.12, 특히, "평소와 같이"어디에서 왔는지 모르겠지만 8.12는 정규 표현식 패턴 ( _*) 만 말합니다 . 그러나 이것은 최신 버전의 사양에서 명확 해졌습니다.
Daniel C. Sobral

16
나는 당신이 아마 @와 함께 사용하지 않을 Some(_)것이 아니라 오히려의 내용과 일치시키고 Some싶지만 여전히 Some 자체를 참조하려는 경우에 추가 할 것입니다 case x @ Some(7) => println(x). 내가 해석하는 것처럼 그것은 case x @ Some(_)더 장황한 버전입니다 case x: Some.
Theo

2
이것도 "스칼라 프로그래밍-2 판"의 섹션 15.2의 "가변 바인딩"에 설명되어 있으며 섹션 26.3 (추출기에 관한 장)에서 다시 사용됩니다.
양 Shaun

@Theo case x: Some는 저절로 작동하지 않습니다. 당신은 case x: Some[_]덜 장황한 을 사용해야합니다
Luigi Plinge

74

@성공적으로 일치하는 패턴 또는 하위 패턴에 이름을 바인딩하는 데 사용할 수 있습니다. 패턴은 패턴 매칭, <-이해를위한 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)

10

패턴 매칭을 할 때 variable @ pattern결합 변수를 일치 값 무늬 패턴과 일치하는 경우. 이때 수단의 값에 해당한다는 x것이다 Some(Nil)경우 절에서.


9

패턴의 최상위와 일치시킬 수 있습니다. 예:

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

6
최상위 만이 아닙니다.
Daniel C. Sobral

2

x일치하는 패턴으로 값을 설정합니다 . 당신의 예에서, x그러므로 것 Some(Nil)(당신에 대한 호출에서 결정할 수로 에 println )


1
iPhone이 백틱을 렌더링 할 수없는 문제를 해결하십시오!
oxbow_lakes
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.