新Scala的延迟标识符是否有变化?

时间:2017-08-23 07:23:01

标签: scala

def mayBeTwice(b:Boolean,i: =>Int) = {
    val j = i

    if (b) j+j else 0
}
def mayBeTwice(b:Boolean,i: =>Int) = {
    lazy val j = i

    if (b) j+j else 0
}
val x=Stream.mayBeTwice(true,{println("hi");41+1})

上面的代码执行是相同的结果,但这不是Scala书中函数式编程中描述的内容。

1 个答案:

答案 0 :(得分:0)

它与您在本书中的内容有何不同? pkg install --accept --licenses perl-512 pkg install --accept --licenses perl-522 pkg install golang-17 延迟评估,直到第一次使用。您的代码看起来可能相同,但它们是不同的。当您发送false时,永远不会评估lazy val。这可能会澄清:

j

来自REPL:

def mayBeTwice(b:Boolean, i:Int) = { 
  lazy val j = { println("hi"); i }
  if (b) j+j else 0 
} 

在第二种情况下,j永远不会被评估。