gpt4 book ai didi

Scala:处理元组返回值是否需要临时变量?

转载 作者:行者123 更新时间:2023-12-04 20:15:07 24 4
gpt4 key购买 nike

考虑以下在 Scala 中使用循环清空队列的草图:

var queue = immutable.Queue[T]( /* .. some content ..*/ )
while( !queue.isEmpty ) {
val (record, tempQueue) = queue.dequeue
queue = tempQueue
doSomethingWith(record)
}

有没有什么技巧可以避免使用临时变量tempQueue,让Scala将返回的Queue值直接赋给循环变量queue?不得不引入额外的符号很烦人,而且可能会有一些多余的复制(虽然这可能会被优化掉,但不确定)。

编辑 1:当然,正如 Ionut G. Stan 指出的那样,我可以跳过模式匹配并自己拆开返回的对,如下所示:

while( !queue.isEmpty ) {
val pair = queue.dequeue
queue = pair._2
doSomethingWith(pair._1)
}

所以我应该将问题细化如下:有没有办法使用模式匹配的语法糖来更优雅地做到这一点?我希望有这样的东西,不幸的是它没有编译:

var queue = immutable.Queue[T]( /* .. some content ..*/ )
var record : A = _
while( !queue.isEmpty ) {
(record, queue) = queue.dequeue
doSomethingWith(record)
}

最佳答案

如果您坚持保留该结构(while 循环等),我看不出您可以如何缩短它,也许除了:

var queue = immutable.Queue[T]( /* some content */ )
while( !queue.isEmpty ) queue.dequeue match {
case (record, tempQueue) =>
queue = queue.dequeue
doSomethingWith(record)
}

但是,由于您使用的是不可变队列,因此最简单的等效代码可能是:

for(record <- queue) {
doSomethingWith(record)
}

另见 this related question这证实无法使用模式匹配符号分配给预先存在的 var

Scala Language Specification ,第 4.1 节也很清楚:模式匹配式赋值扩展为 val 定义,即它们将绑定(bind)一个新的标识符。

关于Scala:处理元组返回值是否需要临时变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8576448/

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