考虑这段代码 -
(defn make-getter
[pred]
(defn getter
[db-name htree-name]
(filter pred (HTreeMap. db-name htree-name))))
(def meta-data-key? #(= (.getKey %) "META_DATA"))
(def not-meta-data-key? #(not (= (.getKey %) "META_DATA")))
(def get-type (make-getter meta-data-key?))
(def get-records (make-getter not-meta-data-key?))
HTreeMap 是一个在 JDBM HTree 之上实现 Map 接口的 java 类。地图中有两种记录 - 键为“META_DATA”的记录和其余记录。get-type 函数应该返回的只是带有“META_DATA”键的条目,get-records 应该返回除了带有“META_DATA”键的条目之外的所有内容。但是,如果现在调用 get-type,它甚至会返回那些 getKey() != "META_DATA" 的记录。如果我将 get-type 和 get-records 的顺序更改为
(def get-records (make-getter not-meta-data-key?))
(def get-type (make-getter meta-data-key?))
那么这两个函数都只返回那些 getKey() == "META_DATA" 的记录。为什么已经定义的函数的定义会被后面定义的函数覆盖?