我正在使用第三方庫(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