如何将协议一般扩展到ClojureScript集合

时间:2016-01-10 01:02:53

标签: protocols clojurescript

如果您尝试运行以下代码,您将看到它将编译,但在运行时在倒数第二行上失败,原因是“没有为类型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接口。有没有比使用协议进行代码复制更好的解决方法?

0 个答案:

没有答案