斯卡拉@运营商

Scala的@运营商是做什么的?

例如,在Scala中的forms语言处理博客文章中,有一个类似的东西

case x @ Some(Nil) => x 

它使人们能够将一个匹配的模式绑定到一个variables。 考虑以下情况,例如:

 val o: Option[Int] = Some(2) 

您可以轻松提取内容:

 o match { case Some(x) => println(x) case None => } 

但是如果你不想要Some 内容 ,但是select本身呢? 这将会完成这个:

 o match { case x @ Some(_) => println(x) case None => } 

请注意@可以在任何级别使用,而不只是在匹配的顶层。

@可用于将名称绑定到成功匹配的模式或子模式。 模式可以在模式匹配中使用,在<-进行理解和解构分配的左侧。

 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 @ patternvariables绑定到与模式匹配的值。 在这种情况下,这意味着在这种情况下, 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来确定)