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

欢迎!请参阅关于页面了解更多有关该页如何运作的信息。

0
Clojure

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

9 个答案

0
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 日期为 08/Mar/12,于 2012 年 4 月 2 日的最新主分支上运行顺畅,构建和测试均无问题。Tassilo 已签署 CA。

0

评论者:tsdh

更新补丁,使其再次能够顺畅地应用于主分支。

0

评论者:bbloom

我查询这个工单是因为遇到了一个反射警告:`with-open` 没有暗示它与 `java.io.Closeable` 进行了绑定

关于补丁的一些反馈

1) 这是一个破坏性更改,对于依赖于 `close` 方法是 duck-typed 的人来说。

2) `CloseableResource` 名称有点长。clojure.core.protocols.Closeable 就足够清晰了。

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

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

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

0

评论者:tsdh

布兰登,两个问题

通过提供某种默认实现,是否能绕过 1)?我认为可以在对象上扩展协议并实现 `.close this`,但这将给出一个反射警告,因为对象本身没有 `close` 方法。可能可以在对象上扩展并使用 `java.lang.reflect` 在实现中搜索“close”方法,如果找不到则抛出异常?

请告诉我更多关于`:on-interface`选项的信息?它与扩展有何不同?如何用该选项添加实现,例如,(`.close this`)?

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