我正在使用第三方库(clj-msgpack),并希望扩展该库也提供处理程序的类型的协议。扩展库提供的协议,而不会影响其他用户
就其本身而言,这很简单 - 但是有什么办法可以做到这一点,而不会影响在同一个JVM中运行的这个库的其他用户吗?类似于动态变量绑定(仅在栈上的给定点下生效)将是理想的。
目前,我正在做无条件覆盖,但使用动态变量来启用我的修改行为;然而,这感觉像猴子修补我的舒适太像。
对于好奇的(承认憎恶)我把到位如下:
(in-ns 'clj-msgpack.core)
(def ^:dynamic *keywordize-strings*
"Assume that any string starting with a colon should be unpacked to a keyword"
false)
(extend-protocol Unwrapable
RawValue
(unwrap [o]
(let [v (.getString o)]
(if (and *keywordize-strings* (.startsWith v ":"))
(keyword (.substring v 1))
v))))
叉,添加你需要的功能,并提交拉请求; ^) – noahlz
@noahz我已经提交了一个包含代码的票。无论上游是否认为此功能_desirable_是一个非常值得怀疑的事情 - 但我不确定如果我是他们,我会接受它。 –
我做了这个评论tounge-cheek(出于你提到的原因),但另一方面,API应该是“开放的扩展,关闭修改”。 – noahlz