我有val
:
val something = System.nanoTime
然后进行一系列方法调用:
foo(something) {
bar(something, 2) { etc }
}
我想推迟val
分辨率,直到最后一种实际上与它有关的方法。我知道scala的lazy
修饰符,但似乎传递something
作为参数会自动解析它的值,无论该变量是否在该方法中使用。
到目前为止我的(有点难看)解决方案是:
val something = () => System.nanoTime
虽然这有效,但它涉及更改所有方法签名,在这种情况下从Long
更改为() => Long
。我想可能有更优雅的解决方法,你们觉得怎么样?
答案 0 :(得分: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)