Używam biblioteki innej firmy (clj-msgpack) i chcę rozszerzyć protokół dla typu, który biblioteka udostępnia również dla programu obsługi.Rozszerzanie protokołu udostępnianego przez bibliotekę bez wpływu na innych użytkowników.
Sam w sobie jest to dość proste - ale czy jest jakiś sposób na zrobienie tego, co nie miałoby wpływu na innych użytkowników tej biblioteki działającej w tej samej maszynie JVM? Coś podobnego do dynamicznego wiązania var (działającego tylko pod danym punktem na stosie) byłoby idealne.
W tej chwili robię bezwarunkowe zastąpienie, ale przy użyciu dynamicznego var, aby umożliwić moje zmodyfikowane zachowanie; to jednak wydaje mi się zbyt wiele jak łatanie małp dla mojej wygody.
Dla ciekawskich, The (dopuszczone obrzydliwością) Kładę na miejsce następująca:
(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))))
Widelec, dodać funkcję trzeba, a przesłać żądanie pobrania; ^) – noahlz
@noahz Wysłałem bilet z kodem. Niezależnie od tego, czy ta funkcja jest pożądana, to bardzo wątpliwa rzecz - nie jestem pewien, czy zaakceptowałbym ją, gdybym była nimi. –
Zrobiłem ten komentarz tounge-cheek (z powodów, o których wspomniałeś), ale z drugiej strony ... API powinny być "otwarte dla rozszerzenia, zamknięte dla modyfikacji". – noahlz