加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在没有未来的情况下获得Scala承诺的结果

发布时间:2020-12-16 09:08:14 所属栏目:安全 来源:网络整理
导读:有没有办法直接从成功的承诺中获取价值? 是否真的有必要将未来与承诺联系起来? scala import scala.concurrent._import scala.concurrent._scala val result = Promise[Int]result: scala.concurrent.Promise[Int] = scala.concurrent.impl.Promise$Defaul
有没有办法直接从成功的承诺中获取价值?
是否真的有必要将未来与承诺联系起来?

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

我正在考虑使用一个线程安全的“赋值一次”语义.在scala.concurrent源中,promise对象看起来很精简,据我所知它是线程安全的.但是,我宁愿避免添加另一个对象(未来).我找不到承诺的成功价值的吸气剂.

解决方法

TL;博士

p.future == p

所以不要担心额外的分配.

讨论

承诺和未来是免费的.前者表示计算的写(一次)侧,而后者是读侧.

因此,为了从Promise读取值,您将始终需要通过Future来完成.

另一方面,值得注意的是,尽管采用抽象设计,但实施效率非常高,Promise和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相同,它只是获得了不同的语义.

最重要的是,您可以从承诺中获取未来,并且您不会在实例分配方面支付任何额外费用.

此外,如果您愿意,可以使语法更好

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读