如何通过检查等价来从向量中删除记录?

时间:2016-09-18 23:49:45

标签: clojure

在java中,我可以这样做:

myList.add(myObj);

然后像这样删除它

myList.remove(myObj);

这可以通过使用equals方法并检查myList中的每个元素的等效性来实现。

在clojure中,我可以这样做:

(def myvec [myrecord])

但我无法使用myrecordmyvec删除remove,如下所示:

(remove myrecord myvec)

因为我收到错误:

ClassCastException myproj.Task cannot be cast to clojure.lang.IFn  clojure.core/complement/fn--4611 (core.clj:1392)

如何以类似于java方法的方式从向量中删除记录?

1 个答案:

答案 0 :(得分:4)

Remove需要一个运行在集合中每个项目上的函数,它只保留函数返回falsey值的项目。在您的情况下,通过告诉您对象不是函数,错误消息是正确的。

您可以显式编写在对象上使用equals的函数,也可以将要删除的对象添加到集合中。集合充当一个函数,当它的输入是该集合的成员时,它返回一个真值。

(remove #{myrecord} myvec)

一个具体的例子

(remove #{4 3} [1 2 3 4]) 
;=> (1 2)