考慮以下功能:名副其實的惡意語義?
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] = [email protected]
scala> myCallable.call
Side effect!
res3: String = Hi!
scala> myCallable.call
Side effect!
res4: String = Hi!
的按姓名參數不計算,直到函數「叫」被調用,每次調用函數時都會重新評估。這是我想要的行爲。
但在spec,它說以下有關名稱參數:
「相應的說法是沒有的功能應用的角度進行評估,而是在函數中的每個應用進行評估。」
從這個描述,我不清楚我可以依靠我想要的行爲。 「在功能中使用什麼意思」是什麼?我怎麼知道這是指我的Callable被調用的點(有時在無限期的將來),而不是它被定義的點(非常「在函數內」)?
該代碼正在做我想要的。但是如果我確定這種行爲是可靠的,那麼我會更容易些,而不是在未來版本的scala中可能「修復」的錯誤。
FWIW,這是它「應該」工作的方式,所以如果在規範中存在錯誤而不是實現。但我不確定該規範是否充分說明了這將會發生 - 特別是每次都運行「副作用」。 – 2013-03-26 12:03:56