推迟val解决方案的优雅方式

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.我想可能有更优雅的解决方法,你们怎么想?

dre*_*xin 6

如果不更改签名就不可能这样做,但是你应该使用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)