Scala - 将函数传递给 Future.apply

Scala - Passing a function to Future.apply

我正在学习 Scala,只是熟悉语法。我看到 Future.apply 将函数作为工作要做。

以下完美运行:

val future = Future { doWork(1) }

然而,为了实验,我尝试了其他一些方法,但都没有效果。

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

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

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

这里也是一样的情况。有人可以解释为什么将函数作为要完成的工作传递而不是导致函数实际上成为正在完成的工作的 return 值。另外我将如何处理这个问题。谢谢!

Future {...} 中调用的方法的签名是 def apply[T](body: =>T),其中 => T 是一个 by-name 参数。有关详细信息,请参阅此 documentation

By-name parameters are only evaluated when used.

在例子中

Future(() => doWork(1)) 

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

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

函数未计算,因为 Future 未调用 apply()

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

正确的用法是

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