Clojure记录构造函数不是一流的?

Kur*_*out 7 clojure clojureclr

显然,你不能使用记录构造函数调用apply:

(defrecord Foo. [id field])

(apply Foo. my-list)
Run Code Online (Sandbox Code Playgroud)

在读取时失败,因为它不期待Foo.在那个地方.

我能想到的唯一明显的解决方法是添加工厂功能:

(make-foo [id field] (Foo. id field))
Run Code Online (Sandbox Code Playgroud)

当然可以申请.

我错过了什么吗?我希望这可以来自C#/ Java,但只是觉得它在Clojure中有点令人失望......

Ale*_*ler 10

绕回这个帖子1.3 ......

在Clojure 1.3中,defrecord创建了两个生成的构造函数.鉴于:

(defrecord Person [first last]) 
Run Code Online (Sandbox Code Playgroud)

这将创建一个位置构造函数->Person:

(->Person "alex" "miller")
Run Code Online (Sandbox Code Playgroud)

和地图构造函数map->Person:

(map->Person {:first "string"})
Run Code Online (Sandbox Code Playgroud)

因为这是一个映射,所有键都是可选的,并在构造的对象中采用nil值.

您应该在声明记录的ns中要求/使用这些函数,但不需要像使用Java类构造函数那样导入记录类.

更多细节:


Ale*_*ler 6

Foo.是一个Java类构造函数,因此它具有典型的Java互操作约束以及您如何调用它.创建构造函数是一种常见的解决方案(这也意味着您不必在不同的命名空间中导入Foo).