8

我是 clojure 的新手,基本上是在尝试学习一些教程。我有一个关于defrecords 的问题。

这是我想做的事情:

(defrecord somemap [key1 key2 key3 key4])

(defn give-me-map [m1 m2]
  (somemap. m1 m2))

在上面的代码中,我希望有key3和作为可选的,这样我就不需要在每次创建对象key4时给它们赋值。somemap

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

那么是否可以defrecord使用可选字段进行定义?

4

2 回答 2

9

使用 时(defrecord T [...]),会创建两个工厂函数:->Tmap->T.

第一个使用位置参数作为键。第二个将任意映射应用于记录。

您可以在构造函数中保留key3andkey4并使用map->somemap.

(defrecord somemap [key1 key2 key3 key4])

(defn give-me-map
  [key1 key2]
  (map->somemap {:key1 key1 :key2 key2}))
于 2012-11-15T07:22:26.950 回答
6

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

因此,使用 only key1and声明您的记录key2是正确的:only key1andkey2将在构造函数中是必需的,但是您可以通过将它们的值关联到记录上来轻松设置key3or (或任何其他键,就此而言),就像任何其他地图一样。key4

于 2012-11-15T05:36:45.550 回答