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"
Другие вопросы по тегам