Clojure:IllegalArgumentException键必须是整数

use*_*747 2 clojure

我有两个清单:

(def xxa ["olp" "xyz"])
(def xxb ["ulove" "alove" "holp" "sholp"])
Run Code Online (Sandbox Code Playgroud)

和一个函数试图获取第一个列表的元素作为第二个列表的元素的一部分:

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

(in-array xxa xxb)应返回["olp"]

但我得到:

IllegalArgumentException Key must be integer  clojure.lang.APersistentVector.invoke
Run Code Online (Sandbox Code Playgroud)

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

Art*_*ldt 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

user> (xxa xxb)
IllegalArgumentException Key must be integer  clojure.lang.APersistentVector.invoke (APersistentVector.java:284)
Run Code Online (Sandbox Code Playgroud)

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

user> (xxa 1)
"xyz"
Run Code Online (Sandbox Code Playgroud)

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

user> (in-array xxa xxb)
("olp")
Run Code Online (Sandbox Code Playgroud)

结果是来自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"] 
Run Code Online (Sandbox Code Playgroud)

现在它完全匹配.