3

我有一个val

val something = System.nanoTime

然后经过一系列方法调用:

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

我想将val解决方案推迟到最后一个实际使用它的方法。我知道 scala 的lazy修饰符,但似乎something作为参数传递会自动解析它的值,无论变量是否在该方法中被使用。

到目前为止,我的(有点丑陋的)解决方案是:

val something = () => System.nanoTime

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

4

1 回答 1

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)
于 2012-09-12T15:23:42.823 回答