我在尝试将字面量映射作为dispatch-fn使用时,发现了defmulti
宏的一个小边缘情况
(defmulti frob {:dispatch :map})
根据其参数列表,attr-map?
参数是可选的,因此应该将其解析为其必需的dispatch-fn
。但它被解释为变量元数据映射,并且函数被设置为nil
。
(frob :dispatch) ;; => 执行错误(NullPointerException)在scratch/eval68113(REPL:169)。;; 不能调用"clojure.lang.IFn.invoke(Object)",因为"this.dispatchFn"为null
显然使用映射来分发多方法并不是很有意义(等价于一个从arg->dispatch值到闭包的转换映射),但仍可能是一个需要考虑的情况。