将惰性值作为函数或方法参数传递而不进行评估?

时间:2019-09-06 16:00:05

标签: 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.

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

1 个答案:

答案 0 :(得分:3)

如果可以在函数签名中使用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"