Scala:`for`模式匹配中的奇怪行为
循环模式匹配的Scala:`for`模式匹配中的奇怪行为,scala,for-loop,pattern-matching,Scala,For Loop,Pattern Matching,循环模式匹配的中的奇怪行为: 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 scala>val a=Seq(部分(1),无) a:Seq[Option[Int]]=列
中的奇怪行为:
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
scala>val a=Seq(部分(1),无)
a:Seq[Option[Int]]=列表(部分(1),无)
scala>for(Some)(x)for(None这是因为None
被解释为变量名:
scala> for (None <- a) { println(None) }
Some(1)
None
你知道吗,这是一个bug:
scala>val vs=Seq(部分(1),无)
vs:Seq[Option[Int]]=列表(部分(1),无)
scala>for(n@None for(vfor(()})
for(x)为什么这不是一个bug呢?val None
左边的东西是不同的,因为定义形式不同于val模式
形式。@som snytt我发现for
(模式1)和val
(模式2)之间唯一的区别是在is\uuuu
验收中。但是,您的答案中的示例表明,至少在Pattern1=
中违反了规范,因为它显示了不同的行为。如果使用此问题的解决方法,它会起作用:scala>for(n@None-Ha,我也使用了n
,但是你输入得更快。顺便说一句,你可以取消绿色复选框,这样人们就不会认为Scala应该是这样工作的。我把这个问题链接到这里,这样Scala的人们就不会在这些小问题上浪费时间。顺便说一句,例如for(某些(x)
scala> val None = 5
None: Int = 5
scala> val Some(a) = Some(5)
a: Int = 5
scala> val vs = Seq(Some(1), None)
vs: Seq[Option[Int]] = List(Some(1), None)
scala> for (n @ None <- vs) println(n)
None
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