我正在实现一个自定义数据结构,出于所有意图和目的,它是一个有序映射。我想对它进行编程,以便我可以在地图上使用所有clojure的抽象,例如assoc
,count
等。为了做到这一点,我需要扩展我的新排序地图类型的clojure clojure.lang.IPersistentMap
协议。
我的问题是:assocEx
做了什么,或者它的目的是什么?在普通的clojure地图上调用它会显示它与assoc
的不同之处在于,如果您尝试插入地图中已存在该键的键/值对,则会引发异常:
user> (.assocEx (cast clojure.lang.IPersistentMap {:a :b}) :a 1)
RuntimeException Key already present clojure.lang.Util.runtimeException (Util.java:219)
这与assoc
不同,user> (.assoc (cast clojure.lang.IPersistentMap {:a :b}) :a 1)
{:a 1}
只是用新的值替换地图中的旧值:
assoc
但我似乎无法找到一个" clojure"函数(上面没有使用互操作形式/强制转换的函数)显示此功能。我们在哪里使用正常的clojure抽象函数(如{{1}}?
)看到此函数的效果答案 0 :(得分:2)
再也没有使用过assocEx
了。它是早期的残余。如果您正在编写自己的地图类型,则可以实施(assocEx [m k v] (throw (Exception.)))
。