枚举和Clojure

Hen*_*gon 16 enums clojure

在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枚举 - 例如 java.util.concurrent.TimeUnit/SECONDS
  • 如果你想要数值,用vars定义你自己的常量 - 例如 (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代码中找到一个例子,尽管很可能存在一个例子;-)


ama*_*loy 6

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

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