Clojure记录构造函数不是一流的?
显然,您不能使用记录构造函数调用apply:Clojure记录构造函数不是一流的?,clojure,clojureclr,Clojure,Clojureclr,显然,您不能使用记录构造函数调用apply: (defrecord Foo. [id field]) (apply Foo. my-list) 读取时失败,因为它不需要Foo。在那个地方 我能想到的唯一明显的解决办法是添加一个factory函数: (make-foo [id field] (Foo. id field)) 这当然可以应用 我遗漏了什么吗?我希望C#/Java能做到这一点,但我只是觉得这在Clojure中有点令人失望…这个问题是众所周知的,Clojure邮件列表上有很多关于它
(defrecord Foo. [id field])
(apply Foo. my-list)
读取时失败,因为它不需要Foo。在那个地方
我能想到的唯一明显的解决办法是添加一个factory函数:
(make-foo [id field] (Foo. id field))
这当然可以应用
我遗漏了什么吗?我希望C#/Java能做到这一点,但我只是觉得这在Clojure中有点令人失望…这个问题是众所周知的,Clojure邮件列表上有很多关于它的讨论。在未来的Clojure版本中可能会添加更多支持 目前,您必须使用自己的函数或支持以下功能的函数:
- 以可评估的形式打印
- 提供clojure函数作为构造函数
- 在构造函数中接受命名参数(映射)
- 参与前/后步行多方法
Foo.
是一个Java类构造函数,因此它具有典型的Java互操作约束,以及如何调用它。创建构造函数是一种常见的解决方案(这也意味着您不必在不同的名称空间中导入Foo)。回到1.3之后
在Clojure 1.3中,defrecord创建两个生成的构造函数。鉴于:
(defrecord Person [first last])
这将创建一个位置构造函数->Person
:
(->Person "alex" "miller")
(map->Person {:first "string"})
还有一个映射构造函数map->Person
:
(->Person "alex" "miller")
(map->Person {:first "string"})
因为这是一个映射,所以所有键都是可选的,并且在构造的对象中具有nil值
您应该在声明记录的ns中要求/使用这些函数,但不需要像使用Java类构造函数时那样导入记录类
更多详情: