1

我正在使用多种方法来解析命令行命令及其参数。

(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"))
4

1 回答 1

6

没有这种可能。第一个原因(直截了当)是它defmethod不提供为特定方法设置元数据的能力(只defmulti允许这样做,但仅限于整个多方法)。第二个原因是 multimethod 本质上是一个函数,只是具有多个执行“变体”,每个“变体”都根据传递的参数触发。粗略地说,从调用者的角度来看,函数之间没有特别的区别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 ...))

就个人而言,我会根据特定功能是多方法还是普通功能来考虑依赖于实现细节。此外,如果您需要明确记录多方法的每种方法,则应考虑将每种方法替换为普通函数,并且根本不要使用多方法。

于 2016-09-17T13:53:15.603 回答