2017-03-21 38 views
0

我已经写了一个递归函数来获取旅程的总成本。 costOfPath只需调用ubergraph即可获取每次旅程的成本,然后该函数添加并显示它。为什么我在这个递归函数中得到一个ClassCastException

(defn routeCost [parcel cost] 
"Calculate the total route cost" 
    (if (empty? parcel) 
    (print "Total Journey Cost: " cost) 
    ((def first-parcel (first parcel)) 
    (def start (:start first-parcel))      
    (def finish (:finish first-parcel)) 
    (def value (costOfPath start finish)) 
    (def parcel-two (rest parcel)) 
    (routeCost parcel-two (+ cost value))))) 

(routeCost task8 0) 

任务8看起来这样:

(def task8 [(Parcel. :main-office :r131 "Plastic Wallets" "Delivery" 1) 
      (Parcel. :r131 :r111 "CDs" "Delivery" 1) 
      (Parcel. :r111 :r121 "USBs" "Collection" 2) 
      (Parcel. :r121 :main-office "USBs" "Delivery" 2)]) 

功能打印出正确的成本,但给一个ClassCastException。

ClassCastException practice_ubergraph.core.Parcel cannot be cast to clojure.lang.IFn clojure.lang.Var.fn (Var.java:363) 

包裹记录:

(defrecord Parcel [start    
        finish 
        package 
        run-type 
        weight 
        ])  

这究竟是为什么,以及如何我可以阻止它?

编辑:我认为它与IF语句和我已经把方括号放在块周围的方式。

回答

2

正如托尼说,这是一个好主意,尝试你的def的使用限制到顶层。

你看到一个ClassCastException的原因可能是这一行:

((def first-parcel (first parcel)) 

你定义first-parcel,然后用外集parentheseis立即调用它。

它比较本实施例,其产生相似异常:

((def a 1)) 

在这个例子中a得到值1def返回VAR #'user/a,使得计算的表达式是:

(#'user/a) 

#'user/a值是1,并1然后作为一个功能处理。

通常,如果看到cannot be cast to clojure.lang.IFn,请查找一组双括号。

0

请不要在函数中使用def。 这里是Clojure的一个更好的一个

(defn route-cost [parcel cost] "Calculate the total route cost" (if (empty? parcel) (print "Total Journey Cost: " cost) (let [{:keys [start finish]} (first parcel) value (cost-of-path start finish)] (route-cost (rest parcel) (+ cost value)))))

的本质是,你可以写你的代码尽可能简洁。通常我们用烤肉情况Clojure中分化的Java

使用让您的功能将解决一切

相关问题