完全有道理,不应该有太多不同的分发值。但有时分发值并不是开发者所想的。
我不小心在生产环境中使用一个键作为分发函数时遇到了内存泄漏。我的意图是在第一个参数字段中相应的值上进行分发,但错误地处理了键无法找到时的情况,认为该键作为函数将多方法第二个参数视为分发值。
这里是简单的重现。
```
(defmulti foo :type)
(defmethod foo :default [_ _] nil)
(foo {} (Math/random))
```
我的意图是
```
(defmulti foo (fn [x y]
(:type x)))
```
注意,我的有缺陷的代码并没有引起任何功能错误行为,只是由于多方法的缓存机制造成了内存泄漏。