Обновление для наборов в Clojure? - PullRequest
2 голосов
/ 31 июля 2011

У меня есть ряд предметов в наборе, подобных этому:

(def my-set
  #{
    {:id "ab" :a 1 :b 2}
    {:id "abc" :a 1 :b 2}
    {:id "abcd" :a 1 :b 2}
  }
)

: и я хочу обновить один из предметов примерно так:

(update-in-set    my-set  :id  "abc"   {:id "abc" :a 6 :b 20})

.что вернет:

  #{
    {:id "ab" :a 1 :b 2}
    {:id "abc" :a 6 :b 20}
    {:id "abcd" :a 1 :b 2}
  }

: есть ли встроенная функция Clojure или другой простой способ сделать это?

Обновление

В конце концов я сделал это:

(defn update-in-set    [my-set  key  value  new-record]
  (merge (clojure.set/select #(not= (get % key) value) my-set ) new-record)
)

1 Ответ

3 голосов
/ 31 июля 2011

Интересно, не следует ли вам использовать карту вместо набора здесь с ключом в качестве идентификатора.Тогда то, что вы хотите сделать, может быть легко выполнено с помощью assoc.

У вас возникли проблемы, поскольку наборы на самом деле не имеют идеи обновления значений - каждый элемент уникален и присутствует или нет - так чтовам нужно удалить старое значение и добавить новое.Это можно сделать немного проще с conj и disj Я думаю:

(conj (disj #{'a 'b 'c} 'a) 'e)

Что бы убрать 'a и добавить' e.Это предполагает, что у вас есть какой-то способ получить полный предмет из «ключа».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...