Clojure 使用可选键取消录制

Clojure 使用可选键取消录制,clojure,Clojure,我对clojure完全是一个新手,基本上是在学习一些教程。我有一个关于defrecords的问题 以下是我正在尝试做的事情: (defrecord somemap [key1 key2 key3 key4]) (defn give-me-map [m1 m2] (somemap. m1 m2)) 在上面的代码中,我希望将key3和key4作为可选项,这样我就不需要在每次创建somemap对象时给它们赋值 有一个类似的问题,但它与我在这里试图做的相反 那么,是否可以使用可选字段定义defr

我对clojure完全是一个新手,基本上是在学习一些教程。我有一个关于
defrecord
s的问题

以下是我正在尝试做的事情:

(defrecord somemap [key1 key2 key3 key4])

(defn give-me-map [m1 m2]
  (somemap. m1 m2))
在上面的代码中,我希望将
key3
key4
作为可选项,这样我就不需要在每次创建
somemap
对象时给它们赋值

有一个类似的问题,但它与我在这里试图做的相反


那么,是否可以使用可选字段定义
defrecord

由于Clojure中的记录实现了映射接口,因此除了构造函数中指定的字段之外,所有字段都是可选的

因此,仅使用
key1
key2
声明您的记录是正确的:构造函数中只需要
key1
key2
,但您可以轻松设置
key3
key4
(或任何其他键)通过像任何其他映射一样将值关联到记录上。

当您使用
(defrecord T[…])
时,将创建两个工厂函数:
->T
映射->T

第一种方法将位置参数用作关键点。第二种方法将任意映射应用于记录

您可以在构造函数中保留
key3
key4
,并使用
map->somemap

(defrecord somemap [key1 key2 key3 key4])

(defn give-me-map
  [key1 key2]
  (map->somemap {:key1 key1 :key2 key2}))

如果你是clojure的新手,你可能想跳过defrecord,现在它是表兄弟。如果没有它们,您可以编写很多有用的代码。我对记录的理解是,在使用map->constructor时,所有键都是可选的。例如,参见:```(defRecordBar[abc])(defR(map->Bar{:c30}))#我的N.Bar{:a nil,:b nil,:c 30}```