在Scala中使用惰性val(或val)函数
我已经看过很多关于val、lazy val和def之间区别的主题,但它们似乎都没有完全回答我的问题 我想知道当val是一个函数时,val(或lazy val)和def之间的区别是什么。事实上,我读到的大多数答案都解释了val只计算一次,而def每次调用时都会计算一次。我不明白的是,在以下代码中使用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(
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=…
。希望它更有意义。是的,我现在明白了。谢谢!