Удалить запись из коллекции в Clojure - PullRequest
0 голосов
/ 08 ноября 2018

Я новичок в Clojure и мне интересно, как удалить элемент из коллекции.

Скажи, что у меня есть:

(def example ["a" "b" "c"])

Я хочу быть в состоянии удалить сказать "б", и когда я звоню

(println example)

и пусть он возвращает коллекцию только с "a" и "c"

Я знаю, используя (remove (partial = "b") example) вернет то, что я хочу, но тогда как мне обновить пример переменной с этим?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 08 ноября 2018

Сначала проверьте, действительно ли вам нужна мутация. Clojure разработан для работы с неизменяемыми данными - есть вероятность, что то, что вы в конечном итоге хотите сделать, может быть достигнуто без изменения значений на месте.

Если вам нужны изменяемые данные, вы можете создать атом для этого - изменение значения автомобиля обычно является плохой практикой.

(def example (atom ["a" "b" "c"]))

(println @example) ;; ["a" "b" "c"]

(swap! example #(remove (partial = "b") %))

(println @example) ;; ["a" "c"]
0 голосов
/ 11 ноября 2018

Структуры данных 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

0 голосов
/ 08 ноября 2018
(filter (fn [x] (not (= x "b"))) example)

Получит вас '("a" "c"). Пара баллов:

  1. Вы не должны думать с точки зрения мутации. Весь смысл использования функционального программирования в целом и замыкания с его постоянными структурами данных, в частности, состоит в том, чтобы избежать проблем, связанных с изменчивостью.
  2. Если вам действительно действительно, действительно нужно что-то для изменчивости, вы можете использовать атомы, но если вы не уверены , вам нужно, чтобы оно было изменчивым, а вы нет.
...