2014-07-07 3 views
1

지도 (지도로 표시) 또는지도의 목록 중 하나를 처리 할 수있는 함수를 작성하고 싶습니다.Clojure지도를지도 목록과 구분하는 다중 방법

defmulti/defmethod를 사용할 수 있습니까? 누구든지지도 또는지도 목록에 대한 테스트 기능을 작성하는 방법의 예제를 가르쳐 주시겠습니까?

답변

5

당신이 유형에 전환 단지 수 Multimethods가 자동으로 클래스 계층 구조를 사용합니다 :

당신은 만들기 위해이 같은 건물의 경우에주의해야
(defmulti process class) 

(defmethod process clojure.lang.IPersistentMap [m] 
    (println "got map")) 

(defmethod process clojure.lang.Sequential [s] 
    (println "got sequential")) 

(defmethod process :default [o] 
    (println "got something else")) 

당신이 구체적으로 실행되지 않습니다 두 가지 경우를 충족시키는 유형. 그렇다면 임의로 선택됩니다. prefer-method을 사용하여 환경 설정을 정의하십시오. (프로토콜로 위의 것과 똑같은 impl을 할 수는 있지만 프로토콜로 선호되는 결과를 선택하는 등가의 방법은 없다).

아니면 관심있는 경우 탐지에 발송 방법을 임의로 영리 만들 수 있습니다 : 여러지도 클래스가 있다는 것을

(defmulti process 
    (fn [o] 
    (cond 
     (map? o) :map 
     (sequential? o) :sequential 
     :else (class o)))) 

(defmethod process :map [m] 
    (println "got map")) 

(defmethod process :sequential [s] 
    (println "got sequential")) 

(defmethod process :default [o] 
    (println "got something else")) 
2

당신은 같은 것을 할 수 그러나

(defmulti foo type) 

(defmethod foo clojure.lang.IPersistentMap [m] 
    (println "map")) 

(defmethod foo clojure.lang.Sequential [m] 
    (println "sequential")) 

를, 조건, 예를 들어, 단일 기능을 가지고 청소기 될 수있다

(if (map? m) 
    (deal with the map) 
    (deal with each map, e.g. by recursing over each element)) 
+0

주 - (클래스는 {}) PersistentArrayMap하지만> 8 키 대부분의지도가 될 것/값 쌍은 실제로 PersistentHashMaps입니다. –

+0

@AlexMiller 당신 말이 맞아요. 내 예를 좀 더 일반적인 것으로 업데이트했습니다. –

관련 문제