gpt4 book ai didi

scala - 获得没有 future 的 Scala promise 的结果

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

有没有办法直接从成功的 promise 中获得值(value)?
真的有必要连接一个future吗?为了那个 promise ?

scala> import scala.concurrent._
import scala.concurrent._

scala> val result = Promise[Int]
result: scala.concurrent.Promise[Int] = scala.concurrent.impl.Promise$DefaultPromise@2b5fa85f

scala> result success 3
res0: result.type = scala.concurrent.impl.Promise$DefaultPromise@2b5fa85f

scala> result
res1: scala.concurrent.Promise[Int] = scala.concurrent.impl.Promise$DefaultPromise@2b5fa85f

scala> result.isCompleted
res4: Boolean = true

scala> result.value
<console>:12: error: value value is not a member of scala.concurrent.Promise[Int]
result.value
^

scala> result.future.value.get.get
res6: Int = 3

我正在考虑使用线程安全的“分配一次”语义的 promise 。在 scala.concurrent 源中promise 对象看起来足够简洁,据我所知它是线程安全的。但是,我宁愿避免添加另一个对象( future )。我找不到 promise 成功值(value)的 setter/getter 。

最佳答案

tl;博士

p.future == p

所以不用担心额外的分配。

讨论
PromiseFuture是免费的。前者代表计算的写入(一次)端,而后者是读取端。

因此,为了从 Promise 中读取值您将始终需要通过 Future 来执行此操作.

另一方面,值得注意的是,尽管设计是抽象的,但实现还是相当高效的, PromiseFuture不是独立的实体。这是 future的实现的 Promise
private[concurrent] trait Promise[T] extends scala.concurrent.Promise[T] with scala.concurrent.Future[T] {
def future: this.type = this
}

所以,你可以看到 p.future实际上与 p 相同,它只是获得了不同的语义。

最重要的是,您可以访问 future从 promise 开始,您将不会在实例分配方面支付任何额外费用。

此外,如果您愿意,您可以使语法更好
scala> implicit class DirectAccessPromise[A](val p: Promise[A]) extends AnyVal {
| def get = p.future.value.get.get
| }
defined class DirectAccessPromise

scala> val p = Promise.successful(42)
res0: scala.concurrent.Promise[Int] = scala.concurrent.impl.Promise$KeptPromise@5e8c92f4

scala> p.get
res1: Int = 42

请注意,由于包装器是一个值类,因此您不会支付任何额外的实例化价格

关于scala - 获得没有 future 的 Scala promise 的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29481871/

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