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

欢迎!请查看关于页面以了解更多有关此功能的信息。

0
Clojure

协议的好例子(并附上文档示例):使 with-open 对使用不同关闭约定的 API 了解 Closable 协议。见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(所有 Readers、Writers、Streams、Channels、Sockets 实现)。在 with-open 中使用它。

所有测试都通过。

0

评论者:tsdh

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

0

评论者:tsdh

更新补丁。

0

评论人员:jafingerhut

补丁0001-Added-ClosableResource-protocol-for-with-open.patch(日期为12/08),截至2012年4月2日的最新主分支应用、构建和测试均无误。Tassilo已经签署了CA。

0

评论者:tsdh

已更新补丁,再次对主分支进行干净的应用。

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报告)
...