Clojure:IllegalArgumentException键必须是整数

时间:2015-04-28 07:34:13

标签: clojure

我有两个清单:

(def xxa ["olp" "xyz"])
(def xxb ["ulove" "alove" "holp" "sholp"])

和一个函数试图获取第一个列表的元素,它们是第二个列表元素的一部分:

(defn in-array
  [array1 array2]
  (for [s1 array1 :when (some #(.contains %1 s1) array2)] s1))

(数组内xxa xxb)应返回[“olp”]

但我明白了:

IllegalArgumentException Key must be integer  clojure.lang.APersistentVector.invoke

我不明白这意味着什么。有人能给我一些启示吗?

1 个答案:

答案 0 :(得分:6)

这是尝试将上面的讨论转化为后来出现的人的明确答案。如果我错过了什么,请告诉我或编辑:

从原始示例开始:

user> (def xxa ["olp" "xyz"])
#'user/xxa
user> (def xxb ["ulove" "alove" "holp" "sholp"])
#'user/xxb
user> (defn in-array [array1 array2]
        (for [s1 array1 :when (some #(.contains %1 s1) array2)] s1))
#'user/in-array

然后正如彼得指出的那样,额外的一组()会导致此错误:

user> (in-array (xxa xxb))
IllegalArgumentException Key must be integer  clojure.lang.APersistentVector.invoke (APersistentVector.java:284)

其中包含的代码多于显示情况所需的代码,因此我们可以将其修改为:

user> (xxa xxb)
IllegalArgumentException Key must be integer  clojure.lang.APersistentVector.invoke (APersistentVector.java:284)

这是显示问题的最小案例。如果我们改变这个例子来传递期望的类型,我们可以看到,当被称为函数时,向量取一个数字并自己查看该数字。

user> (xxa 1)
"xyz"

所以最后我们可以纠正调用并获得预期的输出,几乎完全是:

user> (in-array xxa xxb)
("olp")

结果是来自for表达式的(懒惰)序列,user3166747要求我们通过添加对vec的调用来获取向量(非延迟和随机访问):< / p>

user> (defn in-array [array1 array2]
        (vec (for [s1 array1 :when (some #(.contains %1 s1) array2)] s1)))
#'user/in-array

user> (in-array xxa xxb)
["olp"] 

现在它完全匹配。