斯卡拉@運營商做什麼?斯卡拉@運營商
例如,在博客張貼Formal Language Processing in Scala, Part 2有一個像這樣
case x @ Some(Nil) => x
斯卡拉@運營商做什麼?斯卡拉@運營商
例如,在博客張貼Formal Language Processing in 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 =>
}
注意@
可以在可以使用任何水平,不僅在匹配的頂層。
允許你匹配一個模式的頂層。例如:
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) }
僅限最高級別。 – 2010-03-01 21:42:44
當模式匹配variable @ pattern
結合可變由圖案如果模式匹配相匹配的值。在這種情況下,這意味着在該情況下,x
的值將是Some(Nil)
。
它將值x
設置爲匹配的模式。在你的榜樣,x
因此將會Some(Nil)
(因爲你可以從一個電話確定的println)
該死的iPhone無法呈現倒勾! – 2010-03-01 22:23:03
@
可以用來名稱綁定匹配成功的模式,或子模式。模式可以用於模式匹配,用於理解的<-
的左側,以及解構分配。
scala> val [email protected]([email protected](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 [email protected]([email protected](a), Some(b)) => println(a, b, c, d) }
(1,2,Some(1),(Some(1),Some(2)))
scala> for ([email protected](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)
在文檔中我可以找到答案?我有一種感覺,那裏還埋有其他好東西。 :) – 2010-03-02 22:47:50
@Jim Scala參考,8.1。 8.12,具體來說,雖然我不知道「往常」來自哪裏 - 而8.12只是說正則表達式('_ *')。但也許這已經在新版本的規格中得到了澄清。 – 2010-03-02 22:58:07
我會補充說,你可能不會在'Some(_)'中使用'@',但是如果你想匹配'Some'的內容,但仍然可以引用Some。 'case x @ Some(7)=> println(x)'。正如我解釋的那樣,'case x @ Some(_)'只是'case x:Some'的更詳細的版本。 – Theo 2010-03-03 13:22:27