2016-09-17 29 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。