确实没有太多的不同分发值是有道理的。但有时分发值并不是开发者所想的。
我在生产环境中意外地遇到了使用关键字作为分发函数时的内存泄漏。我的意图是在第一个参数的域值上进行分发,但由于错误地找不到关键字,关键字作为函数错误地将多方法的第二个参数作为分发值。
以下是一个简单的重现
```
(defmulti foo :type)
(defmethod foo :default [_ _] nil)
(foo {} (Math/random))
```
我的意图是让
```
(defmulti foo (fn [x y]
(:type x)))
```
请注意,我错误的代码没有引起任何的运行错误,只是由于多方法的缓存机制导致了内存泄漏。