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(v
for(()})
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