ClassCastException:java.lang.Boolean不能强制转换为clojure.lang.IFn

时间:2014-10-13 18:02:00

标签: clojure

Stack Overflow用户通过电子邮件发送给我的问题:

  

我有以下功能:

(defn partial-or-fill-at-test? [price]
  (if (partial-or-fill-at? price) true (do (println "WRONG PRICE") false)))
     

我使用它时出现以下错误:

java.lang.ClassCastException: java.lang.Boolean cannot be cast to clojure.lang.IFn
     

我希望在谓词结果为false时打印一些东西。任何帮助都可以。

1 个答案:

答案 0 :(得分:1)

问题出现在partial-or-fill-at?的定义中。如果我尝试将partial-or-fill-at?作为函数进行简单定义,那么一切正常:

(defn partial-or-fill-at? [price] (> price 100))

(defn partial-or-fill-at-test? [price]
  (if (partial-or-fill-at? price) true (do (println "WRONG PRICE") false)))
user=> (partial-or-fill-at-test? 200)
true
user=> (partial-or-fill-at-test? 50)
WRONG PRICE
false

错误消息java.lang.Boolean cannot be cast to clojure.lang.IFn表示在某处,您有一个布尔(truefalse)尝试用作IFn(函数的Clojure名称) )。

代码中的truefalse文字被用作值,而不是函数,所以这不是问题。布尔值可以像函数一样使用的唯一地方是partial-or-fill-at?。如果您使用布尔值定义它,使用def而不是defn,则会出现此错误。例如,也许你不小心写了这个:

; earlier in the code
(def price 500)

; …

(def partial-or-fill-at? (> price 100))

当你的意思是:

(defn partial-or-fill-at? [price] (> price 100))

检查partial-or-fill-at?的定义 - 同时确保所有括号均衡并且定义涵盖了您期望它的代码部分 - 并弄清楚如何将其值从布尔值更改为函数。 / p>