Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure记录构造函数不是一流的?_Clojure_Clojureclr - Fatal编程技术网

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

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邮件列表上有很多关于它

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

(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类构造函数时那样导入记录类

更多详情:


这是一个Java类,应该是一个实现细节吗?我认为这是具有更好性能特征的“新”defstruct。我希望它只是一个实现细节,但事实并非如此。请参阅我对1.3之后的其他回答。Java类的本质现在在很大程度上可以忽略。我同意这有点奇怪,但就我个人而言,这从来都不是一个问题,因为我发现工厂函数非常有用-这种模式支持更惯用的Clojure用法,在预处理参数方面给你更大的灵活性,允许不同的构造函数集用于不同的目的,提供一个抽象层等。