枚举

定义枚举

枚举默认是模块内访问,通过pub关键字来定义公共枚举

枚举的命名跟结构体命名一样,必须以大写字母开头;枚举项的名称跟函数命名一样,必须是小写加下划线

  1. enum Color {
  2. blue // 如果没有指定初始值,默认从0开始,然后往下递增1
  3. green
  4. white
  5. black
  6. }
  7. fn main() {
  8. mut c := Color.green // 第一次定义要使用:枚举名称.枚举值
  9. println(c) // 输出green
  10. c = Color.blue
  11. c = .blue // 第二次修改赋值,也可以忽略枚举名称,直接使用.枚举值就可以了
  12. println(c) // 输出blue
  13. }

也可以指定枚举值的值,枚举值也可以是负数

  1. enum Color2 {
  2. blue = 2 //可以指定初始值
  3. green
  4. white
  5. black
  6. }
  7. enum Color3 {
  8. blue = -4 //初始值也可以是负数
  9. green
  10. white
  11. black
  12. }
  13. fn main() {
  14. mut c := Color2.green
  15. println(c) //输出green
  16. c = .blue
  17. println(c) //输出blue
  18. }

也可以指定枚举的值为16进制

  1. enum W_hex {
  2. a = 0x001 //枚举值也支持16进制
  3. b = 0x010
  4. c = 0x100
  5. }
  6. fn main() {
  7. println(W_hex.a) //输出a
  8. println(W_hex.b) //输出b
  9. println(W_hex.c) //输出c
  10. }

枚举方法

枚举也可以像结构体那样添加方法

  1. enum Color {
  2. red = 1
  3. green
  4. blue
  5. black
  6. white
  7. }
  8. fn (c Color) is_blue() bool { // 枚举方法
  9. return c == .blue
  10. }
  11. fn main() {
  12. b := Color.blue
  13. if b.is_blue() {
  14. println('yes')
  15. println(b)
  16. } else {
  17. println('no')
  18. println(b)
  19. }
  20. }

枚举值/整型相互转换

枚举类型和整数类型是可以相互转换的

  1. enum Color {
  2. red = 1
  3. green
  4. blue
  5. black
  6. white
  7. }
  8. fn main() {
  9. i := 3 // 推断为int
  10. // println(i==.blue) //报错,类型不匹配
  11. e := Color(i) // 转换为枚举类型
  12. println(e == .blue) // 输出true
  13. ii := int(e) // 枚举类型转换为int
  14. println(ii) // 输出3
  15. iii := e // iii是枚举类型
  16. println(typeof(iii).name)
  17. println(iii)
  18. }

枚举类型数组

可以定义枚举类型的数组,数组的值是某个枚举项

  1. struct Abc {
  2. mut:
  3. flags []Flag
  4. }
  5. enum Flag {
  6. flag_one
  7. flag_two
  8. flag_three
  9. }
  10. fn main() {
  11. mut a := Abc{}
  12. a.flags << .flag_one
  13. a.flags << .flag_two
  14. a.flags << .flag_three
  15. println(a.flags)
  16. }

枚举注解

​ 可以像结构体和函数那样,给枚举添加自定义注解

  1. [attr1]
  2. [attr2]
  3. pub enum Color {
  4. black
  5. white
  6. blue
  7. }

关于注解的进一步使用,可以参考注解章节