我正在使用第 3 方库 ( clj-msgpack ),并希望为该库还为其提供处理程序的类型扩展协议。
就其本身而言,这很简单——但有什么方法可以做到这一点,不会影响在同一个 JVM 中运行的该库的其他用户?类似于动态 var 绑定的东西(仅在堆栈上的给定点下生效)将是理想的。
目前,我正在做一个无条件覆盖,但使用一个动态变量来启用我修改后的行为;然而,这让我觉得太像猴子补丁了。
出于好奇,我正在实施的(公认的可憎)如下:
(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))))