假設我有兩個協議:如何將Clojure協議擴展到其他協議?
(defprotocol A
(f [this]))
(defprotocol B
(g [x y]))
我想協議B延伸到支持協議A所有實例:
(extend-protocol A
String
(f [this] (.length this)))
(extend-protocol B
user.A
(g [x y] (* (f x) (f y))))
的主要動機是爲了避免不必分別延伸B至所有A可以擴展到的可能類,或者甚至是其他人可能擴展A的未知類(例如,如果A是公共API的一部分)。
但是這並不工作 - 你喜歡的東西如下:
(g "abc" "abcd")
=> #<IllegalArgumentException java.lang.IllegalArgumentException:
No implementation of method: :g of protocol: #'user/B found for
class: java.lang.String>
這是可能的呢?如果沒有,是否有明智的解決方法來實現相同的目標?
謝謝。我認爲這是對我而言最好的方法 - 與序列庫的類比在這裏很有效! – mikera