Clojure有gen-class,reify,proxy,还有deftype和defrecord来定义新的类数据类型。对于一种重视语法简单性和厌恶不必要的复杂性的语言来说,这似乎是一种反常。有人能解释一下为什么会这样吗?Common Lisp风格的defclass足够了吗?
发布于 2011-08-22 11:20:54
这是三个不同因素的组合:
因此,首先,让我们考虑一下它们的作用。deftype和gen- class 的相似之处在于,它们都定义了一个用于提前编译的命名类。Gen-class排在第一位,其次是clojure 1.2中的deftype。Deftype是首选,并且具有更好的性能特征,但限制更多。deftype类可以符合接口,但不能从另一个类继承。
Reify和proxy都用于在运行时动态创建匿名类的实例。在clojure 1.2中,代理首先出现,reify与deftype和defrecord一起出现。Reify是首选的,就像deftype一样,语义不是很严格。
这就留下了一个问题,为什么deftype和defrecord都是同时出现的,并且有类似的作用。对于大多数目的,我们将使用defrecord:它拥有我们所知道和喜爱的各种clojure优点,可排序性等等。Deftype旨在用作实现其他数据结构的低级构建块。它不包括常规的clojure接口,但是它有可变字段的选项(尽管这不是默认的)。
欲了解更多信息,请查看:
The clojure.org datatypes page
The google group thread where deftype and reify were introduced
发布于 2011-08-22 17:34:02
简而言之,它们都有不同的有用的目的。之所以复杂,是因为需要与底层JVM的不同特性进行有效的互操作。
如果您不需要任何Java互操作,那么在99%的情况下,最好还是坚持使用defrecord或简单的Clojure映射。
如果您想使用protocols
的方法
如果你的需求比较复杂,那么下面的流程图是一个很好的工具来解释为什么你会选择这些选项中的一个而不是其他的:
http://cemerick.com/2011/07/05/flowchart-for-choosing-the-right-clojure-type-definition-form/

https://stackoverflow.com/questions/7142495
复制相似问题