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

时间:2012-09-12 15:11:06

标签: scala lazy-evaluation

我有val

val something = System.nanoTime

然后进行一系列方法调用:

foo(something) {
  bar(something, 2) { etc }
}

我想推迟val分辨率,直到最后一种实际上与它有关的方法。我知道scala的lazy修饰符,但似乎传递something作为参数会自动解析它的值,无论该变量是否在该方法中使用。

到目前为止我的(有点难看)解决方案是:

val something = () => System.nanoTime

虽然这有效,但它涉及更改所有方法签名,在这种情况下从Long更改为() => Long。我想可能有更优雅的解决方法,你们觉得怎么样?

1 个答案:

答案 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)