斯卡拉@运营商
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 @ pattern
将variables绑定到与模式匹配的值。 在这种情况下,这意味着在这种情况下, 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来确定)