Clojure数据结构函数
我是Clojure的新手,正在努力学习基础知识。有一件事让我大吃一惊,那就是理解数据结构和它们使用的函数之间的相关性 例如,如果我创建一个新向量:Clojure数据结构函数,clojure,Clojure,我是Clojure的新手,正在努力学习基础知识。有一件事让我大吃一惊,那就是理解数据结构和它们使用的函数之间的相关性 例如,如果我创建一个新向量: (def my-vec [1 2 3]) 然后,当我尝试调用我的vec时: (my-vec) 我得到: ArityException Wrong number of args (0) passed to: PersistentVector clojure.lang.AFn.throwArity (AFn.java:437) 我知道我可以传递一
(def my-vec [1 2 3])
然后,当我尝试调用我的vec时:
(my-vec)
我得到:
ArityException Wrong number of args (0) passed to: PersistentVector clojure.lang.AFn.throwArity (AFn.java:437)
我知道我可以传递一个参数,它似乎在调用get
,但我怎么知道呢?PersistentVector
使用什么参数?在哪里可以找到关于它的文档
我试过:
(doc PersistentVector)
但是它返回的
nil
我的vec
不是一个函数,所以你应该调用:我的vec
不是(我的vec)
尝试:(nth my vec i)
获取此向量的第i个元素
链接:如果将数字传递给Clojure向量,该向量将使用该数字作为其自身的索引,并返回该索引处的值:
user> (def my-vec [1 2 3 4 5])
#'user/my-vec
user> (my-vec 2)
3
这允许您编写这样的表达式,从vec中获取多个键
user> (map my-vec [1 3 4])
(2 4 5)
文档可在IPersistentVector下找到,如下所示: 特别是:
向量实现IFn,用于一个参数的invoke(),它们假定该参数是一个索引,并在自身中查找,就好像在第N步一样,即向量是其索引的函数。您可以将向量看作是将索引
0,1,2,…,N
映射到值,每个索引一个。抽象地说,这是映射的一个特例,其中键是从0开始的整数。这一概念有助于看到当用作函数时,映射和向量之间在Clojure中的一致性:
(<ILookup-able-collection> <key-for-lookup>)
()
JavaScript做了类似的事情,允许您使用
[]
语法查找数组或对象。这很有帮助!因此,当我做(我的vec)
或(我的vec 1)
时,它调用invoke()
,而IPersistentVector
调用nth
?在代码中找到了答案:嗯,我想有人对你的陈述“看那个数字”感到困惑,这导致了否决票。。请说明这个数字是一个索引,而不是向量中的一个值:)尽管我怀疑有人刚刚否决了这个问题的所有答案。我投了反对票,因为它没有回答我的实际问题。我的问题不是我为什么会出错。这是关于如何找到调用的函数invoke()
是我不知道的神奇部分。