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时打印一些东西。任何帮助都可以。
答案 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
表示在某处,您有一个布尔(true
或false
)尝试用作IFn
(函数的Clojure名称) )。
代码中的true
和false
文字被用作值,而不是函数,所以这不是问题。布尔值可以像函数一样使用的唯一地方是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>