从Scala中的函数返回惰性val时会发生什么?

从Scala中的函数返回惰性val时会发生什么?,scala,playframework,Scala,Playframework,我发现了下面的代码,我不确定它是如何工作的。这是带有Play框架的Scala代码 ## route file ## GET /:object @controllers.ResultsController.resultController(object) 我不确定什么时候评估结果。 我的意思是,退货必须在使用时进行评估,还是在退货时解决 惰性特征离开函数的上下文 在这种情况下,永远不会使用该值,仅作为GET请求的结果返回 非常感谢 是,惰性结果在要返回的getResu

我发现了下面的代码,我不确定它是如何工作的。这是带有Play框架的Scala代码

    ## route file ##

    GET /:object      @controllers.ResultsController.resultController(object)
我不确定什么时候评估结果。 我的意思是,退货必须在使用时进行评估,还是在退货时解决

惰性特征离开函数的上下文

在这种情况下,永远不会使用该值,仅作为GET请求的结果返回

非常感谢

是,惰性结果在要返回的getResult中进行计算。Result-getResult的返回类型不是lazy,实际上不能将函数返回类型定义为lazy。如果出于某种原因,您真的需要延迟计算,那么它可能应该是=>Result或Future[Result]

在这种情况下,该值永远不会被使用,只是作为GET请求的结果返回。这显然是错误的。浏览器不理解Scala,它理解HTTP,它是一种文本格式。这意味着框架必须将结果转换为文本形式,即序列化它,并且无论如何都需要对其进行求值。

是的,延迟结果在getResult中求值以返回。Result-getResult的返回类型不是lazy,实际上不能将函数返回类型定义为lazy。如果出于某种原因,您真的需要延迟计算,那么它可能应该是=>Result或Future[Result]


在这种情况下,该值永远不会被使用,只是作为GET请求的结果返回。这显然是错误的。浏览器不理解Scala,它理解HTTP,它是一种文本格式。这意味着框架必须将结果转换为文本形式,即序列化,并且无论如何都需要对其进行评估。

我在自然解释中添加了行号

1  def private getResult(object: SomeObject): Result = {
2     lazy val result = computeResult(object) match {
3        case Some(response) => JsonOk(response)
4        case None => JsonInternalError(...)
5     }
6     result
7  }
它在第6行解析。因此,它返回getResult方法的实际值 懒惰者在内部使用同步锁。lazy始终验证变量是否已解析。 结果变量是局部变量,总是使用并且只使用一次。所以懒惰是没有意义的。 在您的示例中,根据第2点和第3点,懒惰会降低程序的速度。它还可能导致线路2、3、4的潜在死锁。有关更多数据,请参阅本文中的场景3:死锁与同步的结合


我的建议是把这里的懒汉赶走

我在自然解释中添加了行号

1  def private getResult(object: SomeObject): Result = {
2     lazy val result = computeResult(object) match {
3        case Some(response) => JsonOk(response)
4        case None => JsonInternalError(...)
5     }
6     result
7  }
它在第6行解析。因此,它返回getResult方法的实际值 懒惰者在内部使用同步锁。lazy始终验证变量是否已解析。 结果变量是局部变量,总是使用并且只使用一次。所以懒惰是没有意义的。 在您的示例中,根据第2点和第3点,懒惰会降低程序的速度。它还可能导致线路2、3、4的潜在死锁。有关更多数据,请参阅本文中的场景3:死锁与同步的结合


我的建议是把这里的懒汉赶走

请注意,Future并不是真正的懒惰,只是异步的。@BrianMcCutchon,我同意,但有两点意见。1.速度和真正的懒惰之间存在根本的冲突。在这方面,利用未来,有时忽略它是一种可行的权衡。2.虽然我不知道有这样的标准实现,但是Future的实现只在创建时捕获ExecutionContext,并且只有在调用一些相关方法map、onComplete、ready等时才真正开始评估,这不会破坏Future接口的契约。不过我还是同意,如果这是您想要遵循的路线,您可能需要一些定制的东西。请注意,Future并不是真正的懒惰,只是异步的。@BrianMcCutchon,我同意,但有两点意见。1.速度和真正的懒惰之间存在根本的冲突。在这方面,利用未来,有时忽略它是一种可行的权衡。2.虽然我不知道有这样的标准实现,但是Future的实现只在创建时捕获ExecutionContext,并且只有在调用一些相关方法map、onComplete、ready等时才真正开始评估,这不会破坏Future接口的契约。但我还是同意,如果这是你想要遵循的路线,你可能需要一些定制的东西。