gpt4 book ai didi

Clojure 的 defrecord - 如何使用它?

转载 作者:行者123 更新时间:2023-12-02 09:30:16 25 4
gpt4 key购买 nike

我正在尝试使用 Clojure 中的 defrecord 创建自己的不可变数据类型/方法。目标是拥有一个可以创建实例的数据类型,然后调用其方法以返回其自身的新副本以及变异变量。假设 a 和 b 是向量。我想更新两者中的值,并返回整个结构的新副本,并更新这些向量。这显然无法编译,我只是想表达我的想法。

(defrecord MyType [a b]
(constructor [N]
; I'd like to build an initial instance, creating a and b as vectors of length N
)

(mutate-and-return []
; I'd like to mutate (assoc the vectors) and return the new structure, a and b modified
)
)

我想根据需要多次调用构造函数,然后调用变异函数(还有其他不会变异的函数,但我不想让问题变得更加复杂)。

或者,如果这不是惯用的 Clojure,你应该如何做这样的事情?

最佳答案

以下是定义记录的方法:

(defrecord MyType [a b])

请注意,在 Clojure 中,您通常不会在记录类型本身中定义“方法”(异常(exception)情况是您想直接实现 Java 接口(interface)或协议(protocol))。

一个基本的构造函数(以 -> 为前缀)会免费自动生成:

(def foo (->MyType [1 2 3] [4 5 6]))

foo
=> #user.MyType{:a [1 2 3], :b [4 5 6]}

然后您可以编写使用它的更复杂的构造函数,例如

(defn mytype-with-length [n]
(let [a (vec (range n))
b (vec (range n))]
(->MyType a b)))

(mytype-with-length 3)
=> #user.MyType{:a [0 1 2], :b [0 1 2]}

“mutate-and-return”也是免费的 - 你可以使用 assoc :

(assoc foo :b [7 8 9])
=> user.MyType{:a [1 2 3], :b [7 8 9]}

关于Clojure 的 defrecord - 如何使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11958027/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com