显然,你不能使用记录构造函数调用apply:
(defrecord Foo. [id field])
(apply Foo. my-list)
在读取时失败,因为它不期待Foo。在那个地方。
我能想到的唯一明显的解决方法是添加工厂功能:
(make-foo [id field] (Foo. id field))
当然可以应用。
我错过了什么吗?我期待这个来自C#/ Java,但只是觉得它在Clojure中有点令人失望......
答案 0 :(得分:10)
重新回到1.3后......
在Clojure 1.3中,defrecord创建了两个生成的构造函数。给出:
(defrecord Person [first last])
这将创建一个位置构造函数->Person
:
(->Person "alex" "miller")
和地图构造函数map->Person
:
(map->Person {:first "string"})
因为这是一个映射,所有键都是可选的,并在构造的对象中取nil值。
您应该在声明记录的ns中要求/使用这些函数,但不需要像使用Java类构造函数那样导入记录类。
更多详情:
答案 1 :(得分:6)
Foo.
是一个Java类构造函数,因此它具有典型的Java互操作约束以及您如何调用它。创建构造函数是一种常见的解决方案(这也意味着您不必在不同的命名空间中导入Foo)。
答案 2 :(得分:3)
问题是众所周知的,在Clojure邮件列表上有很多关于它的讨论。未来的Clojure版本可能会增加更多的支持。
现在您必须使用自己的功能或使用支持某些功能的https://github.com/david-mcneil/defrecord2: