如果你扩展一个类型以实现一个协议,然后创建该类型的一个实例,该实例在元数据中带有对同一协议的自己的实现,ClojureScript 仍然会使用类型的实现,而 Clojure 则使用更具体的元数据实现。
以下是一个基于 ClojureScript 协议元数据实现测试的一个简短视频示例。
编辑:我在这个编辑器中无法使代码示例变得可读,请参见此 gist: https://gist.github.com/cjohansen/a24257ecb5db15c7e20aaa25ff713b30
(defprotocol ExtMetaProtocol
:extend-via-metadata true
(ext-meta-protocol [x]))
(ext-meta-protocol (with-meta {} {`ext-meta-protocol (fn [_] 1)})) ;;=> 1
(extend-type clojure.lang.PersistentArrayMap
ExtMetaProtocol
(ext-meta-protocol [m]
2))
(ext-meta-protocol {}) ;;=> 2
(ext-meta-protocol (with-meta {} {`ext-meta-protocol (fn [_] 1)})) ;;=> cljs => 2, clj => 1