Scala - 将函数传递给Future.apply

use*_*467 3 syntax scala semantics

我正在学习Scala并熟悉语法.我看到这Future.apply需要一个功能作为工作.

以下工作完美:

val future = Future { doWork(1) }
Run Code Online (Sandbox Code Playgroud)

然而,仅仅为了实验,我尝试了其他一些方法来做到这一点,并且都没有适当的工作.

val future = Future(() => doWork(1))
Run Code Online (Sandbox Code Playgroud)

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

val work: () => Int = () => doWork(index)
val future = Future(work)
Run Code Online (Sandbox Code Playgroud)

这里的情况相同.有人可以解释为什么传递函数作为要完成的工作而不是导致函数实际上成为正在完成的工作的返回值.我也将如何解决这个问题.谢谢!

Iva*_*iuc 6

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

仅在使用时评估名称参数.

在例子中

Future(() => doWork(1)) 
Run Code Online (Sandbox Code Playgroud)

val work: () => Int = () => doWork(index)
val future = Future(work)
Run Code Online (Sandbox Code Playgroud)

您作为by-name参数函数传递类型() => Int或相同Function0[Int].在评估Futurewhen by-name参数时返回此函数.

该函数未被评估为Future不调用apply().

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

正确的用法是

val work: () => Int = () => doWork(index)
val future = Future(work())
Run Code Online (Sandbox Code Playgroud)