gpt4 book ai didi

scala - 模式匹配scala中的常量表达式?

转载 作者:行者123 更新时间:2023-12-02 22:20:32 24 4
gpt4 key购买 nike

是否可以重写下面的代码

for (i <- x) {
if (i==x.first) {
// do sth
} else if (i==x.last) {
// do sth
} else {
// do sth
}
}

像这样使用模式匹配

for (i <- x) i match { 
case `x.first` => // do sth
case `x.last` => // do sth
case _ => // do sth
}

我知道我们可以使用guard,或者预先对x.firstx.last进行求值,然后将它们存入其他的val中去在这里引用,但这很丑陋。有任何想法吗?谢谢!

最佳答案

一种简洁的方法是为自己定义提取器 +::+:

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
}
}

然后你可以简单地做:

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))

打印:

first is 1
middle contains 2
middle contains 3
last is 4

关于scala - 模式匹配scala中的常量表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13769531/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com