枚举和Clojure

时间:2012-08-08 00:35:47

标签: clojure enums

在Java / C世界中,人们经常使用枚举。如果我使用的是使用枚举的Java库,我可以在它们和关键字之间进行转换,例如,使用(. java.lang.Enum valueOf e..., (aget ^"[Ljava.lang.Enum;" (. e (getEnumConstants)) i)和一些反射。但是在Clojure世界中,人们是否需要像枚举(命名整数)这样的东西?如果没有,他们的代码如何构建,他们不需要它们?如果是,那相当于什么?我觉得我真的在询问索引(用于循环),它们在函数式编程中很少使用(到目前为止我只使用了map-indexed一次)。

3 个答案:

答案 0 :(得分:19)

由于Arthur points out - 关键字通常在Clojure中用于代替枚举。

你不会看到编号索引的使用太多 - 它们在Clojure(或大多数其他函数式编程语言)中并不是特别惯用的

其他一些值得注意的选择:

  • 直接使用Java枚举 - 例如java.util.concurrent.TimeUnit/SECONDS
  • 如果需要数值,请使用变量定义自己的常量 - 例如(def ^:const PURPLE 1)
  • 如果您想要使用简单语法的更高级枚举功能,您甚至可以实现宏defenum

答案 1 :(得分:14)

对于几乎所有的Clojure代码,我看到关键字倾向于使用而不是枚举它们是名称间隔的,并且具有关键字的所有其他有用属性,同时更容易编写。它们并不完全是因为它们比Java枚举更具动态性(如动态类型)

至于索引和循环我发现映射一系列关键字更加惯用:

(map do-stuff [:a :b :c :d] (range)) 

而不是遍历枚举中的值,我还没有在Clojure代码中找到一个例子,尽管很可能存在一个例子; - )

答案 2 :(得分:5)

是的,在Java程序员使用枚举的大多数地方使用关键字。在极少数情况下,您需要为每个数字添加一个数字,您只需定义要转换的地图:{:dog 0, :rabbit 1, ...}

另一方面,我写的第一个Clojure库就是这样一个:defenum宏,它为符号分配数字并来回创建转换系统。这是一个相当好的实施的可怕想法,所以请have a look随意,但我不建议您使用它。