2015-10-23 23 views
6

奇怪的行爲在for循環模式匹配:Scala的:在`for`圖案匹配奇怪的行爲爲無的情況下

scala> val a = Seq(Some(1), None) 
a: Seq[Option[Int]] = List(Some(1), None) 

scala> for (Some(x) <- a) { println(x) } 
1 

scala> for (None <- a) { println("none") } 
none 
none 

爲什麼在第二個例子中的兩個輸出'none'產生?也許這個例子是合成的並且不實用,但是這種行爲是不可預期的。這個錯誤或功能?

回答

8

你知道什麼,這是一個錯誤:

https://issues.scala-lang.org/browse/SI-9324

scala> val vs = Seq(Some(1), None) 
vs: Seq[Option[Int]] = List(Some(1), None) 

scala> for (n @ None <- vs) println(n) 
None 

在umambiguous該規範:

http://www.scala-lang.org/files/archive/spec/2.11/06-expressions.html#for-comprehensions-and-for-loops

比較中游分配,不表現出的bug:

scala> for (v <- vs; None = v) println(v) 
scala.MatchError: Some(1) (of class scala.Some) 
    at $anonfun$1.apply(<console>:9) 
    at $anonfun$1.apply(<console>:9) 
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:245) 
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:245) 
    at scala.collection.immutable.List.foreach(List.scala:381) 
    at scala.collection.TraversableLike$class.map(TraversableLike.scala:245) 
    at scala.collection.immutable.List.map(List.scala:285) 
    ... 33 elided 
+1

如果從這個問題使用解決方法,它的工作原理:'scala> for(n @ None < - a)println(「none」)' 產生'none'輸出 –

+0

Ha,我也用'n', 。 –

+0

順便說一下,你可以取消選中綠色,所以人們不認爲這是斯卡拉應該如何工作。我在這裏把這個問題聯繫起來了,所以斯卡拉人不認爲人們不會浪費時間在這些小問題上。 –

4

這是因爲None被解釋爲變量的名稱:

scala> for (None <- a) { println(None) } 
Some(1) 
None 

這裏被簡化例如無for

scala> val None = 5 
None: Int = 5 

scala> val Some(a) = Some(5) 
a: Int = 5 
+0

什麼解決辦法? (\ x < - a如果x.isEmpty){println(「none」)沒有工作( –

+0

'for(_ < - a.collect {case None =>()})' – dk14

+0

' 「)}'' – dk14