Mam trochę kodu, który używa wielu metod i chciałbym przeładować funkcję (w tym przypadku wielofunkcyjną), tak, żebym mógł przekazać wyższą kolejność funkcji, na przykład do testowania.Czy możliwe jest przeciążenie wielu metod Clojure w arytmie?
Oto przykład:
(ns multi)
(defn my-print [m] (println "The colour is" (:colour m)))
(defmulti which-colour-mm (fn [m f] (:colour m)))
(defmethod which-colour-mm :blue [m f] (f m))
(defmethod which-colour-mm :red [m f] (f m))
(defmethod which-colour-mm :default [m f] (println "Default: Neither Blue nor Red"))
(defn which-colour
([m] (which-colour-mm m my-print))
([m f] (which-colour-mm m f)))
(which-colour {:colour :blue :object :ball})
(which-colour {:colour :yellow :object :ball})
(which-colour {:colour :blue :animal :parrot} (fn [m] (println "The " (:animal m) "is" (:colour m))))
Więc moja defn zapewnia arity przeciążenia, ale zastanawiam się, czy defmethod obsługuje czegoś takiego. (Chyba nie chcesz tego robić dla każdej deklaracji defmethod.)
Czy jest to najbardziej odpowiednie podejście (czy mogę powiedzieć, idiomatic), czy jest lepszy sposób?
Lubię to i odpowiedź ANKUR, ale ten wykorzystuje arity przeciążenia v s drugi, który używa liczby argumentów do dopasowania wartości wysyłki. Domyślam się, że warto skorzystać z metody defn, jeśli chcesz mieć tę samą domyślną funkcję dla każdej wartości wysyłki (i unikać powielania) w porównaniu do przeciążania na poziomie defmethod, jeśli chcesz mieć inną wartość domyślną dla każdej wartości wysyłkowej. –