它向编译器承诺 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