在Java/C世界中,人们经常使用枚举.如果我使用的是使用枚举的Java库,我可以在它们和关键字之间进行转换,例如,使用(. java.lang.Enum valueOf e..., (aget ^"[Ljava.lang.Enum;" (. e (getEnumConstants)) i)和一些反射.但是在Clojure世界中,人们是否需要像枚举(命名整数)这样的东西?如果没有,他们的代码如何构建,他们不需要它们?如果是,那相当于什么?我感觉我真的在询问索引(用于循环),它们在函数式编程中很少使用(到目前为止我只使用了map-indexed一次).
mik*_*era 20
正如Arthur指出的那样 - 关键字通常用于Clojure代替枚举.
您不会看到编号索引的使用太多 - 它们在Clojure(或大多数其他函数式编程语言)中并不是特别惯用
其他一些值得注意的选择:
java.util.concurrent.TimeUnit/SECONDS(def ^:const PURPLE 1)defenum如果您想要使用简单语法的更高级枚举功能,您甚至可以实现宏.Art*_*ldt 16
对于几乎所有的Clojure代码,我看到的关键字倾向于使用而不是Enums,它们是名称间隔的,并且具有关键字的所有其他有用属性,同时更容易编写.它们并不完全是因为它们比Java枚举更具动态性(如动态类型)
至于索引和循环,我发现映射一系列关键字更加惯用:
(map do-stuff [:a :b :c :d] (range))
Run Code Online (Sandbox Code Playgroud)
而不是循环遍历枚举中的值,我还没有在Clojure代码中找到一个例子,尽管很可能存在一个例子;-)