Clojure multimethod, дающий неожиданный нулевой указатель
Мне трудно заставить мультиметоды в Clojure работать так, как я ожидал. Дистилляция моего кода выглядит следующим образом.
(defn commandType [_ command] (:command-type command))
(defmulti testMulti commandType)
(defmethod testMulti :one [game command] (str "blah"))
(defmethod testMulti :default [& args] "Cannot understand")
(testMulti "something" {:command-type :one})
(commandType "something" {:command-type :one})
Теперь я ожидал, что здесь будет вызываться метод commandType для аргументов, которые, конечно, будут возвращаться: тот, который должен отправить его первому defmethod, но вместо этого я получаю исключение нулевого указателя. Даже самый простой вызов мультиметода, который я мог придумать, дает мне нулевой указатель:
(defmulti simpleMulti :key)
(defmethod simpleMulti "basic" [params] "basic value")
(simpleMulti {:key "basic"})
И все же пример в документах clojure, расположенных здесь, работает нормально. Есть что-то фундаментальное, что я делаю не так?
1 ответ
Решение
Насколько я вижу, это работает.
Дано
(defmulti testMulti (fn [_ command] (:command-type command)))
(defmethod testMulti :one [game command] (str "blah"))
(defmethod testMulti :default [& args] "Cannot understand")
затем
(testMulti "something" {:command-type :one})
; "blah"
(testMulti "something" {:command-type :two})
; "Cannot understand"
(testMulti "something" 5)
; "Cannot understand"
как и ожидалось.
Я сбрасываю REPL перед запуском выше.
И простой пример тоже работает. Дано
(defmulti simpleMulti :key)
(defmethod simpleMulti "basic" [params] "basic value")
затем
(simpleMulti {:key "basic"})
; "basic value"