Sur*_*rya 12 clojure lazy-evaluation
好的这就是我想要做的
(defn addresses [person-id]
;addresses-retrival )
(defn person [id]
(merge {:addresses (addresses id)} {:name "john"}))
Run Code Online (Sandbox Code Playgroud)
在上面的人员功能中,我希望仅在需要时检索地址,就像我一样
(:addresses (person 10))
Run Code Online (Sandbox Code Playgroud)
而不是什么时候
(person 10)
Run Code Online (Sandbox Code Playgroud)
我不确定我是否正确这样做,对clojure不熟悉.
Nic*_*ury 10
你可以使用延迟.
(defn person [id]
(delay {:addresses (addresses id) :name "john"}))
Run Code Online (Sandbox Code Playgroud)
(人2)将返回延迟,而不评估任何东西.要访问内容并评估延迟对象,请使用force或deref(或@).
(:addresses @(person 5))
Run Code Online (Sandbox Code Playgroud)
或者,您可以仅将延迟放在地址上.
(defn person [id]
{:addresses (delay (addresses id)) :name "john"})
Run Code Online (Sandbox Code Playgroud)
哪个可以更好,取决于你的问题.
它允许定义:
(defn get-address [person]
@(:address person))
Run Code Online (Sandbox Code Playgroud)
哪个会得到延迟的地址并强迫它.(强制意味着第一次计算并在任何其他时间检索强制结果).
归档时间: |
|
查看次数: |
2320 次 |
最近记录: |