Pab*_*dez 3 scala lazy-evaluation
我有一个val:
val something = System.nanoTime
Run Code Online (Sandbox Code Playgroud)
然后通过一系列方法调用:
foo(something) {
bar(something, 2) { etc }
}
Run Code Online (Sandbox Code Playgroud)
我想推迟val解决,直到最后一个方法实际上做了一些事情.我知道scala的lazy修饰符,但似乎something作为参数传递会自动解析它的值,无论该变量是否在该方法中使用.
到目前为止我的(有些难看)解决方案是:
val something = () => System.nanoTime
Run Code Online (Sandbox Code Playgroud)
虽然这个工作,它涉及改变所有方法签名,在这种情况下,从Long到() => Long.我想可能有更优雅的解决方法,你们怎么想?
如果不更改签名就不可能这样做,但是你应该使用x: => Long而不是x: () => Long.第一个是所谓的by name parameter.每次调用时,都会评估一个名称参数.总的来说它看起来像:
def foo(x: => Long) = {
x + 12 // x will be evaluated here
}
lazy val x = 12L
foo(x)
Run Code Online (Sandbox Code Playgroud)