2016-01-10 4 views
0

Если вы попытаетесь запустить следующий код, вы увидите, что он будет компилироваться, но не выполняется во время выполнения во второй-последней строке из-за «Нет метода протокола NameSayer.say- имя, определенное для типа cljs.core/PersistentArrayMap: {} ", хотя оно удовлетворяет? call возвращает 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

Я никогда не использовал их самостоятельно, поэтому это не будет отличным ответом, но я знаю, что мультиметоды будут выполнять ту же работу и широко используются в ClojureScript.

Смежные вопросы