По следующей функции:
(defn update-map [state key1 key2]
(update-in state [key1 key2] update-fn)
)
Если я вызываю функцию с помощью:
(update-map state :somekey :otherkey)
Я получаю нулевой указатель.
Однако, если я запускаю тот же код внутри функции в REPL или заменяю аргументы, переданные функции обновления, жесткими ключевыми словами, он работает безупречно.
Как передать ключевые слова в качестве аргументов, которые можно передать обновлению?
2 ответа
Я предполагаю, что у вас где-то есть (def state ...)
, и вы путаете локальный state
в своей функции с глобальной переменной state
. Этот код показывает, что происходит:
(defn update-fn [some-map key1 key2]
(update-in some-map [key1 key2] inc ))
(def data {:k1 {:k2 42}})
(update-fn data :k1 :k2) => {:k1 {:k2 43}}
Так что работает как надо. Если это по-прежнему не работает, вам нужно обновить свой вопрос и показать, как определяется state
.
Ни state, ни update-fn не определены.
Вы можете улучшить свою функцию, чтобы принимать любое количество ключевых слов, используя &
(defn update-map [state & ks]
(update-in state ks update-fn))
Похожие вопросы
Новые вопросы
clojure
Clojure - это современный диалект Lisp для виртуальной машины Java (с версиями для CLR и JavaScript). Clojure - это не просто реализация Lisp в Java, он предоставляет доступ к классам и экосистеме Java.