请在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(由所有Reader、Writer、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于2012年3月8日,在截至2012年4月2日的最新master版本上应用、构建和测试都非常干净。Tassilo已签署CA。

0

评论由:tsdh发表

更新补丁,使其再次干净地应用于master。

0

评论者:bbloom

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

关于补丁的一些反馈

1) 这将是一个破坏性的改动,因为它依赖于close方法的duck类型。

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

你不需要扩展CloseableResource到java.io.Closeable,你可以使用:

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

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

0

评论由:tsdh发表

布兰登,两个问题

1) 是否有可能以某种方式绕过这个,通过提供某种默认实现?我猜协议可以在Object之上扩展并实现(.close this),但由于Object没有close方法,这将产生反射警告。可能可以基于Object扩展并在实现中搜索"close"方法,使用java.lang.reflect,如果没有找到,则抛出异常?

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

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