Clojure:如何进入Defrecord构造函数

时间:2014-09-22 21:53:56

标签: clojure

这个问题的标题可能过度指定了实现,但这个想法很简单,我想创建和记录,或类似的东西,它可能是一个由deftype声明的类型等等...我想要使用字符串id和int age创建对象,但是我想将id转换为UUID,并将age转换为int(如果尚未转换为int)。我如何惯用这个?

到目前为止,我有这样的事情:

(let [item (my.model/map->Item {
    :id (UUID/fromString "62c36092-82a1-3a00-93d1-46196ee77204") 
    :age (int 6)})]) 

但我不希望每次创建项目时都执行这两项操作,我希望将该逻辑放在一个位置。我可以创建一个辅助函数来执行此操作,但是在deftype或defrecord中是否内置了对此的支持?

1 个答案:

答案 0 :(得分:4)

最简单的方法是使用一个能够获取输入映射并从中构建项目的函数。

(defn make-item
  [{:keys [id age] :as input}]
  {:pre [(string? id)
         (number? age)]}
  (-> input
      (update-in [:id] #(UUID/fromString %))
      (update-in [:age] int)
      my.model/map->Item))

当您需要更多键或更严格的约束时,这将很好地缩放,并适应其他记录类型。