在Clojure中尝试使用资源

Dao*_*Wen 5 clojure try-with-resources

Clojure是否具有Java的try-with-resources构造的等价物?

如果没有,在Clojure代码中处理这个习惯用法的常用方法是什么?

用于安全打开和关闭资源的Java-7之前的习惯用语非常冗长,以至于它们实际上增加了对该语言的try-with-resources的支持.对我来说,在标准的Clojure库中找不到这个用例的宏似乎很奇怪.

基于Clojure的主流项目存储库的一个示例 - 显示如何在实践中处理此问题 - 将非常有用.

erd*_*dos 9

您可以使用with-open将资源绑定到符号,并确保在控制流离开块时关闭资源.

以下示例来自clojuredocs.

(with-open [r (clojure.java.io/input-stream "myfile.txt")] 
     (loop [c (.read r)] 
       (when (not= c -1)
         (print (char c)) 
         (recur (.read r)))))
Run Code Online (Sandbox Code Playgroud)

这将扩展到以下内容:

(let [r (clojure.java.io/input-stream "myfile.txt")] 
  (try
    (loop [c (.read r)] 
      (when (not= c -1)
        (print (char c)) 
        (recur (.read r))))
    (finally (.close r))))
Run Code Online (Sandbox Code Playgroud)

您可以看到let使用try- finally调用.close()方法创建了一个块.