2024 Clojure 状态调查!中分享您的想法。

欢迎!有关如何工作的更多信息,请参阅关于页面。

0票数
元数据

嗨!
^:once 元数据应用于匿名函数意味着什么?

(db-query-with-resultset* db sql params
                           (^:once fn* [rset]
                             (process-result-set rset opts))
                          opts)

感谢

1 个回答

+4票数

被选中
 
最佳答案

它向编译器承诺 lambda 将只调用一次,因此任何在词法作用域中捕获的变量都可以被垃圾回收。

如果使用不当,这可能是不安全的,但在某些上下文中,为了避免不必要地保留未使用的内存,这是必要的

这个例子展示了它是如何工作的

user=> (let [x (Object.)] (def x (^:once fn* [] x)))
#'user/x
user=> (x)
#object[java.lang.Object 0x2189e7a7 "java.lang.Object@2189e7a7"]
user=> (x)
nil
...