【问题标题】:Scala - Passing a function to Future.applyScala - 将函数传递给 Future.apply
【发布时间】:2019-06-19 11:06:31
【问题描述】:

我正在学习 Scala 并且刚刚熟悉语法。我看到Future.apply 将函数作为工作。

以下工作完美:

val future = Future { doWork(1) }

但是,我只是为了试验而尝试了其他一些方法,但都无法正常工作。

val future = Future(() => doWork(1))

这导致 lambda 成为未来的完成值,而不是 doWork(1) 的返回值。

val work: () => Int = () => doWork(index)
val future = Future(work)

这里的情况相同。有人可以解释为什么将函数作为要完成的工作传递反而导致函数实际上成为正在完成的工作的返回值。另外我该怎么做。谢谢!

【问题讨论】:

标签: scala syntax semantics


【解决方案1】:

Future {...} 中调用的方法的签名是def apply[T](body: =>T),其中=> Tby-name 参数。请参阅此documentation 了解更多信息。

按名称参数仅在使用时进行评估。

在例子中

Future(() => doWork(1)) 

val work: () => Int = () => doWork(index)
val future = Future(work)

您作为() => Int 类型的by-name 参数函数或与Function0[Int] 相同的函数传递。在评估 by-name 参数时,此函数在 Future 中返回。

函数未评估为 Future 未调用 apply()

如果在所有示例中将类型参数添加到Future 会更容易理解。如果doWork 返回Int。在这种情况下,Future { doWork(1) }Future[Int],而在第二个和第三个示例中它是 Future[Function0[Int]]

正确的用法是

val work: () => Int = () => doWork(index)
val future = Future(work())

【讨论】:

    猜你喜欢
    • 2015-07-18
    • 2015-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多