这个问题的标题可能过度指定了实现,但这个想法很简单,我想创建和记录,或类似的东西,它可能是一个由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中是否内置了对此的支持?
答案 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))
当您需要更多键或更严格的约束时,这将很好地缩放,并适应其他记录类型。