我是Clojure的新手,我想知道如何从集合中删除元素。
说我有
(def example ["a" "b" "c"])
我希望能够删除打来的“ b”以及在我打电话时
(println example)
让它返回仅包含“ a”和“ c”的集合
我知道使用(remove (partial = "b") example)
会返回我想要的东西,但是那我该如何更新示例变量呢?
谢谢!
答案 0 :(得分:1)
(filter (fn [x] (not (= x "b"))) example)
会让您'("a" "c")
。几点:
答案 1 :(得分:0)
首先,首先检查您是否真的需要突变。 Clojure是围绕处理不可变数据而设计的-有可能在不更改适当值的情况下实现您最终想要做的事情。
如果您需要可变的数据,则可以为此创建一个原子-更改汽车的价值通常是一种不好的做法。
(def example (atom ["a" "b" "c"]))
(println @example) ;; ["a" "b" "c"]
(swap! example #(remove (partial = "b") %))
(println @example) ;; ["a" "c"]
答案 2 :(得分:0)
Clojure的默认数据结构是不可变的。因此,您不能就地更改矢量,但是可以使用所需元素创建一个新矢量。
在函数上下文中,这是使用remove的方法:
(defn my-func [col]
(let [without-b (remove #(= "b" %) col)]
(println without-b)
; do something else w/ without-b
))
...
=> (my-func ["a" "b" "c"])
(a c)
这是处理集合的惯用Clojure方法,即您从旧集合创建新集合。这没有“显着”的内存或性能影响,因为数据结构是在基于树的数据结构Tries上实现的,您可以在此处了解更多信息: https://hypirion.com/musings/understanding-persistent-vector-pt-1