考虑以下函数:
import java.util.concurrent.Callable;
def callable[T]( operation: =>T) : Callable[T] = {
new Callable[T] {
def call : T = operation
}
}
在 REPL 中,此代码执行我想要的操作:
scala> val myCallable = callable {
| println("Side effect!");
| "Hi!"
| }
myCallable: java.util.concurrent.Callable[String] = $anon$1@11ba4552
scala> myCallable.call
Side effect!
res3: String = Hi!
scala> myCallable.call
Side effect!
res4: String = Hi!
在调用函数'call'之前不会评估by-name参数,并且每次调用该函数时都会重新评估。这就是我想要的行为。
但在规范中,它对按名称参数进行了以下说明:
“相应的参数不会在函数应用时进行评估,而是在函数内的每次使用时进行评估。”
从这个描述中,我不清楚我可以依赖我想要的行为。“在函数内使用”是什么意思?我怎么知道这是指调用我的 Callable 的点(有时在不确定的将来),而不是定义它的点(非常“在函数内”)?
代码正在做我想做的事。但是,如果我确定这种行为是可靠的,而不是可能在某些未来版本的 scala 中“修复”的错误,我会更容易休息。