由于功能键不匹配导致的Clojure Null Pointer异常

时间:2016-11-03 18:23:38

标签: clojure

我正在为勇敢和真实的Clojure开始工作example

(ns the-divine-cheese-code.visualization.svg
  (:require [clojure.string :as s])
  (:refer-clojure :exclude [min max]))

(defn comparator-over-maps
  [comparison-fn ks]
  (fn [maps]
    (zipmap ks
            (map (fn [k] (apply comparison-fn (map k maps)))
                 ks))))

(def min (comparator-over-maps clojure.core/min [:lat :lng]))
(def max (comparator-over-maps clojure.core/max [:lat :lng]))

当我尝试在CIDER REPL中运行以下代码时,我得到一个空指针异常:

(min [{:a 1 :b 3} {:a 5 :b 0}])

我正在尝试识别代码中的错误来源。任何帮助肯定会受到赞赏。

2 个答案:

答案 0 :(得分:3)

函数comparator-over-maps使用您传递的关键字向量来查找地图中的值。在这种情况下,您传递的地图包含密钥:a:b,但您对min的定义是请求密钥:lat:lng,它不存在 - 所以它接收nil,这是NPE的原因。如果您更改一个或另一组关键字以匹配,则该示例应该有效,例如:

(min [{:lat 1 :lng 3} {:lat 5 :lng 0}])

答案 1 :(得分:0)

根据@ BlackBear的评论,我将CIDER REPL中的代码重新命名为:

(min [{:lat 1 :lng 3} {:lat 5 :lng 0}])

它产生了正确的答案:

=> {:lat 1, :lng 0}

感谢您的帮助!