我刚刚开始自学clojure,我很开心。然而,当我开始执行我写的这个功能时,麻烦就开始了!
这是一个简单的函数,可以接受多个参数&返回最后一个和第一个参数之间的差异。
(defn diff-last-first
"gets the difference between the last & the first arguments"
[& args]
(- (get args (- (count args) 1)) (get args 0)))
我知道我可以简单地使用 last 函数来获取args的最后一个元素,但是我无法理解为什么这会抛出 NullPointerException 我执行
(diff-last-first 1 2 3)
答案 0 :(得分:3)
如果您确实想要访问列表的第n个值,可以使用nth
:
(defn diff-last-first [& args]
(- (nth args (dec (count args)))
(nth args 0)))
但是,正如您在问题中指出的那样,使用first
和last
更加惯用:
(defn diff-last-first [& args]
(- (last args)
(first args)))
答案 1 :(得分:2)
(get (list :foo) 0)
评估为零。
列表不应该被索引访问:在Clojure中,这是一个常见的设计决策,可以防止这种低效率。
答案 2 :(得分:0)
好的,明白了!
@vemv是对的! [&安培; args]是一个列表,因此(get args 0)
返回 nil
(defn get-l-f [args] (- (get args (- (count args) 1)) (get args 0)))
按预期工作,而 args 是这里的向量!