完全没有必要有太多不同的分发值。但有时分发值并不是开发者想要的那样。
在生产环境中,我不小心使用关键字作为分发函数时遇到了内存泄漏。我的本意是在第一个参数关联的字段值上进行分发,但不幸的是,当关键字未找到时,关键字作为函数将多方法中的第二个参数视为分发值。
以下是一个简单的复现示例:
```
(defmulti foo :type)
(defmethod foo :default [_ _] nil)
(foo {} (Math/random))
```
我本想得到以下结果:
```
(defmulti foo (fn [x y]
(:type x)))
```
注意,我的有缺陷的代码并没有造成任何功能上的问题,只因为多方法缓存的机制导致了内存泄漏。