带可选键的defrecord

den*_*mus 8 clojure

我是一个完全新手的clojure并试图基本上遵循一些教程.我有一个关于defrecords 的问题.

这是我要做的事情:

(defrecord somemap [key1 key2 key3 key4])

(defn give-me-map [m1 m2]
  (somemap. m1 m2))
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我想拥有key3key4作为可选,这样我每次创建一个somemap对象时都不需要给它们赋值.

还有一个类似的问题在这里,但它的什么,我想在这里做反向.

那么可以defrecord用可选字段定义吗?

kot*_*rak 8

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

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

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

(defrecord somemap [key1 key2 key3 key4])

(defn give-me-map
  [key1 key2]
  (map->somemap {:key1 key1 :key2 key2}))
Run Code Online (Sandbox Code Playgroud)


Jor*_*wis 6

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

因此,只有声明你的记录key1,并key2是正确的:只有key1key2将在构造函数中必需的,但你可以轻松地设置key3key4(或其他任何按键,对于这个问题)由associng一个值,以他们在像任何其他地图的记录.