2016-01-10 26 views
0

如果您尝试运行以下代码,您会看到它将编译,但在倒数第二行的运行时由于“No protocol method NameSayer.say-为cljs.core/PersistentArrayMap类型定义的名称:{}“尽管它满足?调用返回true。 IVector/PersistentVector案件也会发生类似的失败,尽管也满足所需的协议。如何将协议扩展到ClojureScript集合一般

(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

我从来没有用过他们自己,所以这不会是一个好的答案,但我知道multimethods将做同样的工作,并广泛用于ClojureScript。