0

我最近收到错误“ClassCastException clojure.core$num cannot be cast to java.lang.Number clojure.lang.Numbers.gt”。

我实现的名为“getNumber”的函数只获取一个整数。

这是我的名为 getLoop 的函数返回此错误:

 (defn getLoop []
    (getNumber num)
    (loop [z num]
           (when (> z -1)
           (println z)
           (recur (- z 1)))))

一方面,这个查询可以正常工作。

 (defn getLoop []
    (loop [z 3]
           (when (> z -1)
           (println z)
           (recur (- z 1)))))

我想知道如何避免“getLoop”函数中的错误?

提前致谢!

4

2 回答 2

0

numingetLoop和因此z指的是,clojure.core/num这是一个将其参数强制为数字的函数。这就是为什么异常说“clojure.core$num 不能转换为 java.lang.Number”的原因——它表示该函数num正在用于代替数字并且不支持此功能。发生这种情况是因为其中没有任何getLoop内容会绑定num到不同的值。

我认为您的意思是两种可能性之一:

;; First possibility
(defn getLoop [num]
  (loop [z num]
    (when (> z -1)
      (println z)
      (recur (- z 1)))))

;; Usage:
(getLoop (getNumber num))
;; Or:
(-> num getNumber getLoop)

;; Second possibility
(defn getLoop [num]
  (let [num (getNumber num)]
    (loop [z num]
      (when (> z -1)
        (println z)
        (recur (- z 1))))))

;; Usage:
(getLoop num) ;; (It calls `getNumber` internally)
于 2013-11-11T18:09:54.327 回答
0

符号 num 未绑定到(getNumber num)函数体中的返回值。这是更惯用的 Clojure 中的函数:

(defn getLoop [num]
  (loop [n num]
    (when-not (zero? n)
      (println n)
      (recur (dec n)))))

如果您getNumber按照您所说的返回一个数字,它应该可以像这样调用:

(-> num getNumber getLoop)
于 2013-11-11T14:17:23.430 回答