【问题标题】:ClassCastException: java.lang.Boolean cannot be cast to clojure.lang.IFnClassCastException:java.lang.Boolean 不能转换为 clojure.lang.IFn
【发布时间】:2014-10-15 04:32:06
【问题描述】:

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

当谓词的结果为假时,我希望它打印一些东西。任何帮助都可以。

【问题讨论】:

  • 您粘贴partial-or-fill-at 的代码吗?否则就不可能知道出了什么问题。
  • @DiegoBasch 我给这个人发了电子邮件并将他们链接到这个问题;只有他们有代码。 @Andrews,如果您需要帮助查找 partial-or-fill-at? 中的问题,请编辑此问题以包含该函数的代码。

标签: clojure


【解决方案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? 的定义——同时确保所有括号平衡,并且该定义涵盖了您期望的代码部分——并弄清楚如何将其值从布尔值更改为函数。

【讨论】:

    猜你喜欢
    • 2023-04-07
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多