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

欢迎!请访问 关于页面 了解有关如何工作的更多信息。

0
Clojure

良好的协议使用(及文档示例):使 with-open 充分意识到 Closable 协议,适用于使用不同关闭约定的 API。参见 http://groups.google.com/group/clojure/browse_thread/thread/86c87e1fc4b1347c

9 个答案

0

评论者:importer

http://www.assembla.com/spaces/clojure/tickets/308 转换而来

0

评论者:tsdh

添加了一个 CloseableResource 协议,并将其扩展到 java.io.Closeable(由所有读取器、写入器、流、通道和套接字实现)。在 with-open 中使用它。

所有测试均通过。

0

评论者:tsdh

似乎与范围有关(http://dev.clojure.org/jira/browse/CLJ-2)。

0

评论者:tsdh

更新了补丁。

0

评论人:jafingerhut

补丁0001-Added-ClosableResource-protocol-for-with-open.patch,日期为2012年3月8日,在截至2012年4月2日的最新master上正常应用、构建和测试。Tassilo已经签署了CA。

0

评论者:tsdh

更新补丁再次对master版本进行了干净的应用。

0

评论人:bbloom

我查看了这个票据,因为我遇到了一个反射警告:with-open没有提示它绑定到java.io.Closeable

一些关于补丁的反馈

1) 对于依赖于close方法进行鸭子类型的人来说,这是一个破坏性变更。

2) CloseableResource有些长。clojure.core.protocols.Closeable已经足够明确了。

而不是将CloseableResource扩展到java.io.Closeable,您可以使用不太为人知的(未记录的?不受支持的?):on-interface指令

(defprotocol Closeable :on-interface java.io.Closeable (close [this]))

这会比现有的补丁表现得更好。

0

评论者:tsdh

嗨,Brandon,有两个问题

有办法通过提供某种默认实现来绕过1) 吗?我想,我们可以通过在Object上扩展协议来实现这一点,即实现(.close this),但这样会由于Object没有close方法而产生反射警告。可能可以通过在Object基础上扩展,并在实现中使用java.lang.reflect来搜索“close”方法,如果没有找到就抛出异常吗?

你能告诉我更多关于:on-interface选项的信息吗?它与extend有什么区别?以及我如何使用该选项添加实现,即(.close this)?

0
参考:https://clojure.atlassian.net/browse/CLJ-308 (由alex+import报告)
...