由另一个集过滤集时的ClassCastException

时间:2015-04-15 22:11:51

标签: clojure

以下是Clojure Programming

的代码示例
(defn character
  [name & {:as opts}]
  (ref (merge {:name name :itmes #{} :health 500}
              opts)))

(def smaug (character "Smaug" :health 500 :strength 400 :items (set (range 50))))
(def bilbo (character "Bilbo" :health 100 :strength 100))
(def gandalf (character "Gandalf" :health 75 :mana 750))

(defn loot
  [from to]
  (dosync
    (when-let [item (first (:items @from))]
      (alter to update-in [:items] conj item)
      (alter from update-in [:items] disj item))))
(wait-futures 1
              (while (loot smaug bilbo))
              (while (loot smaug gandalf)))
(map (comp count :items deref) [bilbo gandalf])
(filter (:items @bilbo) (:items @gandalf))

一切正常,直到最后一行,这会引发错误:

ClassCastException clojure.lang.PersistentList cannot be cast to clojure.lang.IFn  clojure.core/filter/fn--4264 (core.clj:2605)

2 个答案:

答案 0 :(得分:3)

构造函数“character”拼写错误:items as:itmes,使alter on alter get nil作为初始值。 Conjing nil和一个值给你一个列表 - 因此是ClassCastException。

答案 1 :(得分:3)

您的角色定义中似乎有一个拼写错误 - :itmes而不是:items

这意味着当你掠夺时,你正在打电话

(conj nil 0),将:items下的条目转换为(0)列表。列表未实现IFn,因此错误。