在Java / C世界中,人们经常使用枚举。如果我使用的是使用枚举的Java库,我可以在它们和关键字之间进行转换,例如,使用(. java.lang.Enum valueOf e..., (aget ^"[Ljava.lang.Enum;" (. e (getEnumConstants)) i)
和一些反射。但是在Clojure世界中,人们是否需要像枚举(命名整数)这样的东西?如果没有,他们的代码如何构建,他们不需要它们?如果是,那相当于什么?我觉得我真的在询问索引(用于循环),它们在函数式编程中很少使用(到目前为止我只使用了map-indexed一次)。
答案 0 :(得分:19)
由于Arthur points out - 关键字通常在Clojure中用于代替枚举。
你不会看到编号索引的使用太多 - 它们在Clojure(或大多数其他函数式编程语言)中并不是特别惯用的
其他一些值得注意的选择:
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随意,但我不建议您使用它。