2016-09-17 31 views
1

我正在使用multimethods來解析命令行命令及其參數。如何在clojure中設置和獲取多方法元數據?

(defmulti run (fn [command args] command)) 

(defmethod run :default 
    [& _] 
    ...) 

^{:args "[command]"} 
(defmethod run "help" 
    [_ & [args]] 
    "Display command list or help for a given command" 
    ...) 

^{:args ""} 
(defmethod run "version" 
    [_ & [args]] 
    "Print program's version" 
    ...) 

(defn -main 
    [& args] 
    (run (first args) 
    (next args))) 

當我試圖訪問元數據,具體的方法,Clojure的返回nil

(meta ((methods run) "help")) 

回答

3

有沒有這樣的可能性。第一個原因(簡單的一個)是defmethod沒有提供爲特定方法設置元數據的能力(只有defmulti允許,但僅限於整個多方法)。第二個原因是multimethod本質上是一個單一的函數,只是執行多個「變體」,每個函數根據傳遞的參數觸發。 Rougly說,從主叫方來看,有如下定義的函數f1f2之間沒有特別的差異:

(defmulti f1 (fn [x] x)) 

(defmethod f1 :foo [x] 
    ...) 

(defmethod f1 :bar [x] 
    ...) 

(defmethod f1 :baz [x] 
    ...) 

(defn f2 [x] 
    (case x 
    :foo ... 
    :bar ... 
    :baz ...)) 

就個人而言,我會根據特定的功能是否是多方法還是普通的功能依賴於實施細節考慮。另外,如果您需要明確記錄multimehod的每種方法,則應考慮用普通函數替換每種方法,而不要使用multimethods。