如果您尝试运行以下代码,您将看到它将编译,但在运行时在倒数第二行上失败,原因是“没有为类型cljs.core定义的协议方法NameSayer.say-name / PersistentArrayMap:{}“即使它满足?呼叫返回true。尽管还满足所需的协议,但IVector / PersistentVector案例也会发生类似的失败。
(defprotocol NameSayer
(say-name [input]))
(extend-protocol NameSayer
number
(say-name [_]
"I'm a number!")
string
(say-name [_]
"I'm a string!")
IMap
(say-name [_]
"I'm a map!")
IVector
(say-name [_]
"I'm a vector!"))
(println (satisfies? IMap {}))
(println (satisfies? IVector []))
(println (say-name "hello"))
(println (say-name 100))
(println (say-name {}]))
(println (say-name []))
我在clojurescript.core中窥探并看到像IPrintWithWriter这样的东西,PersistentArrayMap,PersistentHashMap和PersistentTreeMap的实现只是复制,尽管它们都有共同的IMap接口。有没有比使用协议进行代码复制更好的解决方法?