Kan*_*ane 2 scala pattern-matching
是否可以重写以下代码
for (i <- x) {
if (i==x.first) {
// do sth
} else if (i==x.last) {
// do sth
} else {
// do sth
}
}
Run Code Online (Sandbox Code Playgroud)
使用模式匹配
for (i <- x) i match {
case `x.first` => // do sth
case `x.last` => // do sth
case _ => // do sth
}
Run Code Online (Sandbox Code Playgroud)
我知道我们可以使用保护,或评估x.first并x.last提前将它们存储在其他vals到这里引用,但是这只是丑陋.有任何想法吗?谢谢!
一个干净的方式做到这一点是定义提取+:和:+自己:
object +: {
def unapply[CC, A, That](seq: CC)(implicit asSeq: CC => Seq[A], cbf: CanBuildFrom[CC, A, That]): Option[(A, That)] = {
if (seq.nonEmpty)
Some(seq.head, cbf(seq) ++= seq.tail result)
else
None
}
}
object :+ {
def unapply[CC, A, That](seq: CC)(implicit asSeq: CC => Seq[A], cbf: CanBuildFrom[CC, A, That]): Option[(That, A)] = {
if (seq.nonEmpty)
Some(cbf(seq) ++= seq.dropRight(1) result, seq.last)
else
None
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以简单地做:
val x = Seq(1, 2, 3, 4)
val first +: middle :+ last = x
println("first is %s".format(first))
for (y <- middle)
println("middle contains %s".format(y))
println("last is %s".format(last))
Run Code Online (Sandbox Code Playgroud)
哪个印刷品:
first is 1
middle contains 2
middle contains 3
last is 4
Run Code Online (Sandbox Code Playgroud)