在这个示例代码中,我需要打印每个Seq
,问题是当我匹配它时,我只有一个变量x
而不是数组。如何获取数组?此外,此代码仅打印do nothing
两次。
var seq = Seq(Seq(1,2,3),Seq(4,5,6))
seq.foreach { seq2 =>
seq2 match {
case Seq(x) => println(x)
case _ => println("do nothing")
}
}
如果您有一个 homogeneous Seq[Seq[Int]]
,则根本不必匹配:
var seq = Seq(Seq(1,2,3),Seq(4,5,6))
seq foreach println
如果您有一系列像这样的混合元素:
var seq = Seq[Any](Seq(1,2,3), 42)
那么你可以匹配 by type
Seq
,它相当于一个isInstanceOf
。在这种情况下,您必须_
为已擦除的类型添加一个Seq
:
seq.foreach { seq2 =>
seq2 match {
case s: Seq[_] => println(s)
case _ => println("do nothing")
}
}
您应该避免使用第二种变体。最好使用案例类创建自定义密封特征并正确进行模式匹配:
sealed trait ValidSeqContent
case class IntInSeq(i: Int) extends ValidSeqContent
case class SeqOfIntsInSeq(seq: Seq[Int]) extends ValidSeqContent
val seq: Seq[ValidSeqContent] = Seq(
SeqOfIntsInSeq(Seq(1,2,3)),
IntInSeq(42)
)
然后你可以在没有isInstanceOf
类似匹配的情况下进行模式匹配:
seq.foreach{ x =>
x match {
case SeqOfIntsInSeq(s) => println(s)
case _ => { /* do nothing */ }
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句