2012-02-25 25 views
8

Tôi có một multimethod chuyên về hai tham số:bắt defmethod tất cả

(defmulti get-tag-type (fn [type tag] [type tag])) 

Có loại cho phép tôi vào nhóm defmethod khác nhau gọi vào bộ:

(defmethod get-tag-type [::cat 0] [type tag] ::tiger) 
(defmethod get-tag-type [::cat 1] [type tag] ::lion) 
(defmethod get-tag-type [::cat 2] [type tag] ::jaguar) 

(defmethod get-tag-type [::dog 0] [type tag] ::poodle) 
(defmethod get-tag-type [::dog 1] [type tag] ::australian-shepherd) 
(defmethod get-tag-type [::dog 2] [type tag] ::labrador-retriever) 

Tuy nhiên, đôi khi, tôi muốn bắt tất cả hoặc mặc định cho một trong các nhóm, sẽ được gọi nếu không có nhóm nào khác khớp với:

(defmethod get-tag-type [::dog :default] ::mutt) 

Tuy nhiên, điều này không hoạt động trừ khi tag thực sự là :default.

Cách tốt nhất để thực hiện việc này là gì?

Trả lời

7

chức năng công văn của bạn cần phải biết được ánh xạ được đã được xác định để nó có thể quyết định khi nào khu nghỉ mát mặc định. Chức năng methods sẽ trả về các ánh xạ đó cho bạn.

(defmulti get-tag-type (fn [type tag] 
         (let [mlist (methods get-tag-type)] 
          (if-let [d (get mlist [type tag])] 
          [type tag] 
          [type :default])))) 
0

Bạn có thể thay đổi defmulti tới:

(defmulti get-tag-type (fn [type tag] 
         (if (= type ::dog) 
          ::dog 
          [type tag]))) 

Sau đó viết phương pháp của bạn như thế này:

(defmethod get-tag-type ::dog ::mutt) 
+0

Tôi không muốn defmulti biết về các defmethods sẽ sử dụng nó. – Brigham

7

Multimethods hỗ trợ một phương pháp dự phòng, xác định bằng (cấu hình) giá trị :default, nếu không ai trong số các trận đấu các phương pháp khác.

Trong trường hợp của bạn, bạn sẽ chỉ cần thêm:

(defmethod get-tag-type :default [type tag] 
    (do special behaviour here ...)) 

Với ví dụ của bạn, nó có thể là đáng chú ý là bạn có thể thiết lập hệ thống phân cấp sử dụng từ khoá Clojure, và công văn multimethod hiểu những hệ thống phân cấp: http://clojure.org/multimethods

+0

Thật không may, tôi cần các hành vi mặc định là khác nhau cho các giá trị khác nhau của loại, và tôi tin rằng chỉ có một ': mặc định' có thể được định nghĩa cho mỗi phương pháp đa. – Brigham

Các vấn đề liên quan