首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Clojure有5种方法来定义一个类,而不是只有一种?

为什么Clojure有5种方法来定义一个类,而不是只有一种?
EN

Stack Overflow用户
提问于 2011-08-22 10:03:25
回答 2查看 12.7K关注 0票数 87

Clojure有gen-class,reify,proxy,还有deftype和defrecord来定义新的类数据类型。对于一种重视语法简单性和厌恶不必要的复杂性的语言来说,这似乎是一种反常。有人能解释一下为什么会这样吗?Common Lisp风格的defclass足够了吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-22 11:20:54

这是三个不同因素的组合:

  1. jvm的特定类型系统
  2. 在定义类型时,对于不同的用例需要稍有不同的语义
  3. 事实上,这些类型有些是在早期开发的,有些则是后来随着语言的发展而开发的。

因此,首先,让我们考虑一下它们的作用。deftypegen- class 的相似之处在于,它们都定义了一个用于提前编译的命名类。Gen-class排在第一位,其次是clojure 1.2中的deftype。Deftype是首选,并且具有更好的性能特征,但限制更多。deftype类可以符合接口,但不能从另一个类继承。

Reifyproxy都用于在运行时动态创建匿名类的实例。在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

票数 93
EN

Stack Overflow用户

发布于 2011-08-22 17:34:02

简而言之,它们都有不同的有用的目的。之所以复杂,是因为需要与底层JVM的不同特性进行有效的互操作。

如果您不需要任何Java互操作,那么在99%的情况下,最好还是坚持使用defrecord或简单的Clojure映射。

如果您想使用protocols

  • Otherwise,请使用defrecord。常规的
  • 可能是最简单、最具understandable

的方法

如果你的需求比较复杂,那么下面的流程图是一个很好的工具来解释为什么你会选择这些选项中的一个而不是其他的:

http://cemerick.com/2011/07/05/flowchart-for-choosing-the-right-clojure-type-definition-form/

票数 55
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7142495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档