Clojure 2024 年调查问卷 中分享您的想法!

欢迎!关于如何使用本网站,请查阅 关于页面 获取更多信息。

0
Clojure

很好地使用了协议(以及文档示例):让 with-open 能够感知使用了不同关闭惯例的 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

Patch 0001-Added-ClosableResource-protocol-for-with-open.patch 修正案于12年3月8日应用,在截至2012年4月2日的最新主分支上编译和测试干净。Tassilo已经签署了证书。

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,如果没有找到则抛出异常?

你能请告诉我更多关于 :on-interface 选项的信息吗?它与 extend 如何不同?以及我如何用那个选项添加实现,例如,(.close this)?

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