我是一个完全新手的clojure并试图基本上遵循一些教程。我对defrecord
s。
以下是我要做的事情:
(defrecord somemap [key1 key2 key3 key4])
(defn give-me-map [m1 m2]
(somemap. m1 m2))
在上面的代码中,我希望将key3
和key4
作为可选项,这样每次创建somemap
对象时我都不需要为它们赋值。< / p>
有一个类似的问题here,但它与我在这里尝试做的相反。
那么可以用可选字段定义defrecord
吗?
答案 0 :(得分:8)
使用(defrecord T [...])
时,会创建两个工厂函数:->T
和map->T
。
第一个使用位置参数作为键。第二个将任意地图应用于记录。
您可以在构造函数中保留key3
和key4
并使用map->somemap
。
(defrecord somemap [key1 key2 key3 key4])
(defn give-me-map
[key1 key2]
(map->somemap {:key1 key1 :key2 key2}))
答案 1 :(得分:6)
由于Clojure中的记录实现了map接口,因此除了构造函数中指定的字段外,所有字段都是可选的。
因此,仅使用key1
和key2
声明您的记录是正确的:构造函数中只需要key1
和key2
,但您可以轻松设置{{ 1}}或key3
(或任何其他键,就此而言)通过将值与它们相关联到记录上,就像任何其他地图一样。