在Scala中使用惰性val(或val)函数

在Scala中使用惰性val(或val)函数,scala,lazy-evaluation,Scala,Lazy Evaluation,我已经看过很多关于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(

我已经看过很多关于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
lazy val name:Int=>Int={
案例n如果(n<20)=>//终端案例。。。
案例n如果(n<100)=>//终端案例。。。
如果(n<1000)=>name(n/100)+//某个不相关的东西。。。
}
val结果=(1到1000).map(name).sum
为了计算结果,在我看来,对于序列1到1000的每个元素,名称都将被“计算”。在这种情况下,它与使用def有何不同

为了评估结果,在我看来,名称是 序列1至1000的每个元素的“评估”

事实并非如此
lazy val
意味着在您第一次调用它之前,
name
不会被计算。在第一次调用之后,它将评估其定义并被完全定义,然后其他调用使用已经定义的函数

你可以用
def
定义你的函数
name
,它也是一样的


基本上,
val
def
是相同的,使用
lazy val
只需将函数的完整计算推迟到第一次调用。

我的理解是,
lazy
修饰符尽可能地延迟值计算,这意味着直到
map
的第一次迭代,
名称
未定义,在第一次迭代后,
名称
具有在后续迭代中重用的定义,同时,使用
def
意味着每次都要创建一个函数。因此,使用def相当于为每次调用创建一个函数对象,然后将其应用于Arumings?这是我的理解,说明了区别,您唯一改变的是val求值延迟到真正需要时,但除此之外,val将始终包含相同的函数,而def将始终包含不同的函数。谢谢,我错过了那个函数。你确定吗?根据Ende Neu链接的问题的测试答案,def定义的方法的每次调用都会创建一个新的函数对象,这显然不是val的情况。在链接问题中的代码中,是的,它确实创建了一个新函数,因为它定义了一个函数
甚至
,该函数具有返回值的函数,而不是f(Int)->Boolean,但f()->(Int->Boolean)。如果定义
def-even(i:Int):Boolean
它只创建一个函数-相当于
val-even:Int=>Boolean=…
。希望它更有意义。是的,我现在明白了。谢谢!