是否可以克隆多方法?

时间:2016-09-30 13:59:14

标签: clojure

我希望能够采用多方法,将其克隆为单独的变量并添加到它而不更改原始方法。怎么办呢?

(defmulti hello :type)

(defmethod hello :a
  [e] (assoc e :a 1))

(hello {:type :a})
=> {:type :a :a 1}

;; my attempt at cloning
(def world @#'hello)

(defmethod world :b
  [e] (assoc e :b 2))

(world {:type :b})
=> {:type :b :b 2}

;; I want this to throw... but because `hello` and `world` 
;; are the same function, it still works
(hello {:type :b})
=> {:type :b :b 2}

1 个答案:

答案 0 :(得分:2)

通过查看https://github.com/clojure/clojure/blob/master/src/clj/clojure/core.clj#L1769-L1777

来计算出来
df = pd.DataFrame.groupby(['year','cntry', 'state']).agg(['size','sum'])

----回到原来的问题----

(defn clone
  [multi name]
  (let [table (.getMethodTable multi)
        clone (clojure.lang.MultiFn. name 
                                     (.dispatchFn multi) 
                                     (.defaultDispatchVal multi)
                                     (.hierarchy multi)]
    (doseq [[dispatch-val method] table]
      (.addMethod clone dispatch-val method))
    clone))