Scala中firstCompletedOf需要隐含的内容

时间:2016-12-13 13:27:03

标签: scala future implicit

问题

这是scala.concurrent.Future

的摘录
  def firstCompletedOf[T](futures: TraversableOnce[Future[T]])(implicit executor: ExecutionContext): Future[T] = {
    val p = Promise[T]()
    val completeFirst: Try[T] => Unit = p tryComplete _
    futures foreach { _ onComplete completeFirst }
    p.future
  }

我的问题是,为什么我们需要一个隐含的ExecutionContext?它在这个范围内做了什么?

背景

从Java切换到Python我对以下不是正确的Python程序感到不安:

print("some string" + 42)

您必须添加显式转换,因此这将起作用:

print("some string " + str(42))

然后,我开始在Scala中编程,不知何故,暗示开始成为我的噩梦:

我已经阅读了很多关于隐含的文章(this一个是最好的),我仍然不相信,为什么我们需要scala中的含义!?

在我看来,从长远来看,暗示会使您的代码难以理解。

自从切换到scala后,我开始非常喜欢“explicits”(即使我真的喜欢scala)。

有人能指出我有关该主题的任何其他重要资源吗?

2 个答案:

答案 0 :(得分:4)

在该特定上下文中,onComplete回调需要执行上下文。

def onComplete[U](f: (Try[T]) ⇒ U)(implicit executor: ExecutionContext): Unit

直觉是,一旦Future在自己的执行上下文中完成,我们需要计算资源来在回调的闭包中执行逻辑。

关于implicits的一般性讨论,它们是一个强大的工具。引用Ben Parker,“以强大的力量,承担了巨大的责任”

答案 1 :(得分:2)

很棒的资源实际上是scala自己的documentation

在firstCompletedOf中,执行上下文负责计算期货。