サードパーティ ライブラリ ( 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))))