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
...