我有两个清单:
(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
我不明白这意味着什么。有人能给我一些启示吗?
答案 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"]
现在它完全匹配。