Как я могу передать ключевые слова в качестве аргументов, которые могут быть переданы для обновления? - PullRequest
0 голосов
/ 23 октября 2018

Для следующей функции:

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

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

(update-map state :somekey :otherkey)

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

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

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

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Состояние или update-fn не определены.

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

(defn update-map [state & ks]
  (update-in state ks update-fn))
0 голосов
/ 23 октября 2018

Я предполагаю, что у вас где-то есть (def state ...), и вы путаете локальный state в вашей функции с глобальным state var.Этот код показывает, что происходит:

(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.

...