gpt4 book ai didi

playframework-2.0 - 为什么 scala 函数中的 block 变量在执行内部 block 后无法更新?

转载 作者:行者123 更新时间:2023-12-04 07:48:08 25 4
gpt4 key购买 nike

我是 Scala 的新手。我编写了一个名为 calculateSubTotal 的函数,其中包含产品 ID 和数量列表。

首先,该函数会为每个产品 ID 从数据库中提取一个产品,然后计算个人小计 并与小计 相加。我想返回计算出的小计。计算没问题,但不幸的是它返回的是初始化值,而不是计算值。我的代码怎么了。代码如下:-

def calculateSubTotal(productIds: Seq[Int], quantities: Seq[Int]) = {
var subTotal = 0.0
for (index <- 0 to productIds.length - 1) {
val productId = productIds(index)
val quantity = quantities(index)
val futureProduct = Products.read(productId)
for {
product <- futureProduct
} yield {
val listPrice = product.get.listPrice
subTotal += listPrice * quantity
}
}
subTotal
}

看上面的函数总是返回 0.0,因为我已经初始化了。正确的代码是什么?

最佳答案

问题是您的 Products.read() 方法的结果类型是 Future[Option[Product]],这意味着在您当前的代码中它被执行在不同的线程上。主线程(执行 calculateSubTotal 的线程)不会等待成功执行 Products.read() 并返回结果(subTotal 在这种情况下)马上。这将允许不确定的结果:有时 subTotal 根本不会被修改,有时它会被部分修改,有时你会得到一个正确的结果。最简单的解决方案是同步等待 Products.read() 结果:

import scala.concurrent.duration.Duration
import scala.concurrent.Await

Await.result(Products.read(productId), Duration.Inf)

异步解决方案需要以某种方式重写 calculateSubTotal,返回 Future[Int]

关于playframework-2.0 - 为什么 scala 函数中的 block 变量在执行内部 block 后无法更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38373652/

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