2010-03-01 98 views

回答

136

它使人們能夠將匹配的模式綁定到變量。考慮下面的,例如:

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

在文檔中我可以找到答案?我有一種感覺,那裏還埋有其他好東西。 :) – 2010-03-02 22:47:50

+1

@Jim Scala參考,8.1。 8.12,具體來說,雖然我不知道「往常」來自哪裏 - 而8.12只是說正則表達式('_ *')。但也許這已經在新版本的規格中得到了澄清。 – 2010-03-02 22:58:07

+10

我會補充說,你可能不會在'Some(_)'中使用'@',但是如果你想匹配'Some'的內容,但仍然可以引用Some。 'case x @ Some(7)=> println(x)'。正如我解釋的那樣,'case x @ Some(_)'只是'case x:Some'的更詳細的版本。 – Theo 2010-03-03 13:22:27

6

允許你匹配一個模式的頂層。例如:

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

僅限最高級別。 – 2010-03-01 21:42:44

8

當模式匹配variable @ pattern結合可變圖案如果模式匹配相匹配的值。在這種情況下,這意味着在該情況下,x的值將是Some(Nil)

2

它將值x設置爲匹配的模式。在你的榜樣,x因此將會Some(Nil)(因爲你可以從一個電話確定的println

+0

該死的iPhone無法呈現倒勾! – 2010-03-01 22:23:03

58

@可以用來名稱綁定匹配成功的模式,或子模式。模式可以用於模式匹配,用於理解的<-的左側,以及解構分配。

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)