我有两个 list :
(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
我不明白那是什么意思。有人可以给我一些光吗?
最佳答案
这是为了使以后的讨论清楚地回答上面的讨论。如果我错过了什么,请告诉我或进行编辑:
从原始示例开始:
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
添加一个调用来获得该向量: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"]
现在完全匹配。
关于Clojure:IllegalArgumentException键必须为整数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29913121/