Collections 从Clojure中的集合中删除条目

Collections 从Clojure中的集合中删除条目,collections,syntax,clojure,Collections,Syntax,Clojure,我是Clojure的新手,我想知道如何从集合中删除元素 假设我有: (def example ["a" "b" "c"]) 我想在我打电话的时候说“b”就可以了 (println example) 并让它返回一个只有“a”和“c”的集合 我知道使用(删除(partial=“b”)示例) 将返回我想要的内容,但如何使用此更新示例变量 谢谢 (filter (fn [x] (not (= x "b"))) example) 将为您提供”(“a”“c”)。几点: 你不应该考虑基因突变。总体上使用

我是Clojure的新手,我想知道如何从集合中删除元素

假设我有:

(def example ["a" "b" "c"])
我想在我打电话的时候说“b”就可以了

(println example)
并让它返回一个只有“a”和“c”的集合

我知道使用
(删除(partial=“b”)示例)
将返回我想要的内容,但如何使用此更新示例变量

谢谢

(filter (fn [x] (not (= x "b"))) example)
将为您提供
”(“a”“c”)
。几点:

  • 你不应该考虑基因突变。总体上使用函数式编程,特别是使用clojure和它的持久数据结构,其目的是避免与可变性相关的问题
  • 如果你真的,真的需要一些可变的东西,你可以使用原子,但如果你不确定你需要它可变,你就不需要了

  • 首先,首先检查你是否真的需要突变。Clojure是围绕处理不可变数据而设计的—您最终想要做的事情有可能在不改变现有值的情况下实现

    如果您需要可变数据,您可以为此创建一个atom—更改汽车的价值通常是一种不好的做法

    (def example (atom ["a" "b" "c"]))
    
    (println @example) ;; ["a" "b" "c"]
    
    (swap! example #(remove (partial = "b") %))
    
    (println @example) ;; ["a" "c"]
    

    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处理集合的惯用方法,即从旧集合创建新集合。这不会对内存或性能产生“重大”影响,因为数据结构是在基于树的数据结构上实现的,因此,您可以在此处了解更多信息:

    使用
    filter
    insteadAFAIK Clojure的风格是使用不可变的数据结构。因此,
    示例
    应该永远保持原样。您应该创建新的集合,例如使用已经指出的筛选器。