【发布时间】:2018-03-18 11:28:46
【问题描述】:
我正在学习 Clojure 并喜欢它,但发现 Records 中的不一致让我感到困惑:为什么在创建新 Record 时默认映射构造函数 (map->Whatever) 不检查数据完整性?例如:
user=> (defrecord Person [first-name last-name])
#<Class@46ffda99 user.Person>
user=> (map->Person {:first-name "Rich" :last-name "Hickey"})
#user.Person {:first-name "Rich" :last-name "Hickey"}
user=> (map->Person {:first-game "Rich" :last-name "Hickey"})
#user.Person {:first-game "Rich" :first-name nil :last-name "Hickey"}
我相信 Map 不需要定义 Record 定义中的所有字段,它也允许包含不属于 Record 定义的额外字段。另外我知道我可以定义自己的构造函数来包装默认构造函数,并且我认为:post 条件可以用于检查正确(和全面)的记录创建(未能成功使其工作)。
我的问题是:是否有惯用的 Clojure 方法在从 Map 构造记录期间验证数据?而且,我在这里缺少关于 Records 的一些东西吗?
谢谢。
【问题讨论】:
-
老实说,我很少需要将地图转换为记录。我只是使用原始构造函数。用例是什么?如果你正在序列化,你可以使用 EDN 来保证它的安全。
-
我只是重构了一个使用地图的旧代码问题,现在使用记录作为理解其属性的一种方式。 JSON -> 地图向量将变为 JSON -> 记录向量。感谢 EDN 参考。将进行调查。
标签: clojure