次の関数を検討してください。
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!
by-name パラメーターは、関数「call」が呼び出されるまで評価されず、その関数が呼び出されるたびに再評価されます。それが私が望む行動です。
しかし、仕様では、名前によるパラメーターについて次のように述べています。
「対応する引数は、関数適用の時点では評価されませんが、代わりに関数内で使用されるたびに評価されます。」
この説明から、私が望む動作に依存できるかどうかは不明です。「機能内での使用」とはどういう意味ですか? これが、Callable が定義された時点 (非常に「関数内」) ではなく、Callable が呼び出された時点 (無期限の将来) を参照していることをどのように知ることができますか?
コードは私がやりたいことをしています。しかし、この動作が信頼できるものであり、scala の将来のバージョンで「修正」される可能性のあるバグではないと確信できれば、安心できます。