2016-03-06 236 views
1

我有一个很难理解这个例子中的观点:期货Clojure中

(let [result (future (println "this prints once") 
       (+ 1 1))] 
    (println "deref: " (deref result)) 
    (println "@: " @result)) 

The author explains:

注意,字符串“这个打印一次”确实只打印一次,即使你两次解除未来。这表明未来的身体只运行一次,结果2被缓存。

我不明白;该字符串将打印一次,即使不提领未来。这个例子应该教什么?

+3

最可能的仅仅是一个简单的事实,即未来只评估一次,而多个解除引用操作不会触发重新执行。 – zero323

回答

5

我同意这是微妙的。这一点是要表明future是一次性评估。当然,无论您是否参与“结果”,都会发生println副作用。事实上,副作用的发生并没有像你所指出的那样后来导致“结果”的恶化。仅仅绑定“结果”会导致println副作用发生。

更重要的是,这里的想法是,将“结果”两次明确地减去而不是使其被评估(或绑定)两次。换句话说,它不会导致两次的副作用println。你得到的缓存值为2,两次都是deref

有人可能会期望去掉两次会导致它被绑定两次,因此执行两次println。但这种情况并非如此。相反,您只获得一次缓存的deref-ed值。这里的重点更多的是副作用发生在绑定时,而不是解除绑定,并且解除绑定两次不会产生第二次绑定。

2

future在单独的线程中执行随附的代码,并立即开始执行,因此即使未引用结果值,也会运行代码。

我想作者想表明,future正文不会被重新执行时,你不止一次解除引用。