gpt4 book ai didi

Scala - 将函数传递给 Future.apply

转载 作者:行者123 更新时间:2023-12-04 15:52:47 26 4
gpt4 key购买 nike

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

以下完美运行:

val future = Future { doWork(1) }

然而,只是为了实验,我尝试了一些其他方法来做到这一点,但都无法正常工作。

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

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

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

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

最佳答案

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 添加类型参数,将会更易于理解。如果 doWork 返回 Int。在这种情况下 Future { doWork(1) }Future[Int] 而它是 Future[Function0[Int]] 在第二个和第三个例子。

正确的用法是

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

关于Scala - 将函数传递给 Future.apply,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54368232/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com