【问题标题】:Clojure Data Structure FunctionsClojure 数据结构函数
【发布时间】:2012-08-10 06:05:37
【问题描述】:

我是 Clojure 的新手,正在努力学习基础知识。让我感到困惑的一件事是了解数据结构和它们使用的函数之间的相关性。

例如,如果我创建一个新向量:

(def my-vec [1 2 3])

然后当我尝试打电话给my-vec:

(my-vec)

我明白了:

ArityException Wrong number of args (0) passed to: PersistentVector  clojure.lang.AFn.throwArity (AFn.java:437)

我知道我可以传递一个参数,它似乎在调用get,但我怎么知道? PersistentVector 采用什么参数,我在哪里可以找到有关它的文档?

我试过了:

(doc PersistentVector)

但这会返回nil

【问题讨论】:

    标签: clojure


    【解决方案1】:

    可以在 IPersistentVector 下找到文档: http://clojure.org/data_structures

    特别是: 向量实现 IFn,用于一个参数的 invoke(),它们假定它是一个索引,并在自身中查找,就好像按 n 次一样,即向量是它们索引的函数。

    【讨论】:

    【解决方案2】:

    如果您将数字传递给 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)
    

    【讨论】:

    • 嗯,我猜有人对您的陈述“查找该数字”感到困惑,这导致了否决票。请明确说明该数字是索引,而不是向量中的值
    • 已修复 :) 虽然我怀疑有人对这个问题的所有答案都投了反对票
    • 对不起亚瑟。我对此投了反对票,因为它没有回答我的实际问题。我的问题不是关于我为什么会出错。这是关于如何找到正在调用的函数。 invoke() 是我不知道的魔法。
    【解决方案3】:

    您可以将向量视为将索引0, 1, 2, ..., N 映射到值,每个索引对应一个值。抽象地说,它是映射的一个特殊情况,其中键是从 0 开始的整数。这个概念有助于在 Clojure 中将映射和向量用作函数时查看其一致性:

    (<ILookup-able-collection> <key-for-lookup>)
    

    JavaScript 做了类似的事情,允许您使用 [] 语法来查找数组或对象。

    【讨论】:

      【解决方案4】:

      my-vec 不是一个函数,所以你应该调用:my-vec 而不是(my-vec)

      尝试:(nth my-vec i) 获取此向量的第 i 个元素。

      链接:nth

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-17
        相关资源
        最近更新 更多