【问题标题】:Promise of 'Nothing' is never completed?“一无所有”的承诺永远不会完成?
【发布时间】:2012-04-06 20:58:03
【问题描述】:

我想知道为什么当我将“_”作为完成结果传递时,“无”的承诺永远不会完成。当我想使用 Promise 来表示某事已完成时,我遇到了这个问题:

  val promiseWillFinish = Promise()
  promiseWillFinish.success(_)
  // will time out
  Await.ready(promiseWillFinish, 5 seconds)
  // will return false
  println(promiseWillFinish.isCompleted)

现在我使用的是 Promise of Unit,它工作得很好,也更清晰一些。但我仍然想知道上面的哪个代码以超时/未完成的 Promise 结束。

我用 Akka 2.0 final 运行了这个。

【问题讨论】:

    标签: scala akka promise


    【解决方案1】:

    我不认为promiseWillFinish.success(_) 意味着你认为它的意思。它是部分应用,这意味着该表达式的结果是一个函数。您从未调用过success 方法,只是为方法调用创建了一个新的匿名函数。

    我猜你有一个Promise[Nothing] 并试图使用_ 作为Nothing 类型的默认值。但根据定义,Nothing 类型的值no。见http://en.wikipedia.org/wiki/Bottom_type

    【讨论】:

    • 感谢您的澄清。
    【解决方案2】:

    没有任何可能的Nothing 类型的值(不是null,根本没有)。 Nothing 的承诺无法完成,就像结果类型为 Nothing 的函数无法返回一样。

    由于没有Nothing 类型的值,因此无法调用成功。事实上,您并没有称其为成功,您误解了 _ 在这里的含义:

    当您声明var 时(并且仅在您声明它时),您可以使用“_”将其设置为默认值。 var v : Int = _v 设置为0var v: String = _ 将其设置为null。如果您尝试使用 Nothing var v : Nothing = _ ,它会崩溃。同样,没有Nothing 类型的值。

    另一方面,当你写 promiseWithFinish.Success(_) 时,它是

    x => promiseWithFinish.Success(x)
    

    你正在创建一个函数值,而不是使用它,你什么也没做。

    【讨论】:

    • 好的,谢谢。我预计我在这里用 '_' 误解了 Nothing。感谢您的澄清。
    猜你喜欢
    • 2015-01-01
    • 2016-05-06
    • 2019-11-29
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    相关资源
    最近更新 更多