我看过很多关于val,lazy val和def之间区别的话题,但是没有一个能回答我的问题。
我想知道当val是函数时val(或lazy val)和def之间有什么区别。实际上,我读到的大多数答案都解释了val只被评估一次,而每次调用时都会评估def。我没有得到的是当使用val时,如下面的代码:
lazy val name : Int => Int = {
case n if(n < 20) => //terminal case...
case n if(n < 100) => //terminal case...
case n if(n < 1000) => name(n / 100) + //something unrelevant...
}
val result = (1 to 1000).map(name).sum
为了评估结果,在我看来,对于序列1到1000的每个元素,名称将被“评估”。与在特定情况下使用def 有什么不同?
答案 0 :(得分:2)
为了评估结果,在我看来,名字将是 “评估”序列1到1000的每个元素。
事实并非如此。 lazy val
表示在第一次调用它之前,不会评估name
。在第一次调用之后,它将评估其定义并完全定义,然后其他调用使用已定义的函数。
您绝对可以使用name
定义您的函数def
,它将是相同的。
基本上val
和def
是相同的,使用lazy val
只需将您的函数的完整评估推迟到第一次调用。