По следующей функции:

(defn update-map [state key1 key2] 
    (update-in state [key1 key2] update-fn)
)

Если я вызываю функцию с помощью:

(update-map state :somekey :otherkey)

Я получаю нулевой указатель.

Однако, если я запускаю тот же код внутри функции в REPL или заменяю аргументы, переданные функции обновления, жесткими ключевыми словами, он работает безупречно.

Как передать ключевые слова в качестве аргументов, которые можно передать обновлению?

0
Allan Araújo 23 Окт 2018 в 08:50

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.

1
Alan Thompson 23 Окт 2018 в 16:52

Ни state, ни update-fn не определены.

Вы можете улучшить свою функцию, чтобы принимать любое количество ключевых слов, используя &

(defn update-map [state & ks]
  (update-in state ks update-fn))
1
SneakyPeet 24 Окт 2018 в 04:34
52941956