带可选键的defrecord

时间:2012-11-15 05:26:08

标签: clojure

我是一个完全新手的clojure并试图基本上遵循一些教程。我对defrecord s。

有疑问

以下是我要做的事情:

(defrecord somemap [key1 key2 key3 key4])

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

在上面的代码中,我希望将key3key4作为可选项,这样每次创建somemap对象时我都不需要为它们赋值。< / p>

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

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

2 个答案:

答案 0 :(得分: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}))

答案 1 :(得分:6)

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

因此,仅使用key1key2声明您的记录是正确的:构造函数中只需要key1key2,但您可以轻松设置{{ 1}}或key3(或任何其他键,就此而言)通过将值与它们相关联到记录上,就像任何其他地图一样。