scala - 将惰性值作为函数或方法参数传递而不对其求值?

标签 scala lazy-evaluation

我有一个 lazy val,但是当我将它传递给另一个方法时,它会在该方法需要使用它之前进行评估:

lazy val i = { print("evaluation happened!"); 42 }
def willEvaluate(n: Int) = println("hello")
willEvaluate(i) // Prints "evaluation happened! hello"

我尝试将 n 标记为惰性,但它没有编译:

def willEvaluate(lazy n: Int) = ...
def willEvaluate(n: lazy Int) = ...
// Both fail to compile with error: identifier expected but 'lazy' found.

如何在不计算惰性值的情况下将惰性值传递给另一个方法?

最佳答案

如果您可以在其中使用 lazy 关键字,函数签名肯定会看起来更漂亮,但看起来这是不可能的。但是,您可以通过将参数声明为 by-name parameter 来执行您想要的操作。 :

def wontEvaluate(n: => Int) = println("hello")

然后,当您传递惰性值时,除非实际使用它,否则不会对其进行评估。

lazy val i = { print("evaluation happened! "); 42 }    
def willEvaluate(n: => Int) = println(n)
wontEvaluate(i)  // Prints "hello"
willEvaluate(i)  // Prints "evaluation happened! 42"

关于scala - 将惰性值作为函数或方法参数传递而不对其求值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57825296/

相关文章:

scala - 是否可以为 Spark ML 中的随机森林创建通用训练管道?

jquery - 图像延迟加载(jQuery)后如何更改CSS?

python - 惰性评估 : forward operations to deferred value

scala - 在大型数据集上运行 Spark 时出现 "sparkContext was shut down"

haskell - 为什么对变质产生的未使用值(value)进行评估?

wpf - 如何使 WPF TreeView 数据绑定(bind)惰性和异步?

R 惰性评估- 不工作

scala - 使用Spark的间歇性超时异常

scala - Akka Streams 入口和导出匹配

scala - 在 Scala 中,如何在运行时按具体类型进行过滤?