枚举

定义枚举

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

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

1. enum Color {
2. blue // 如果没有指定初始值,默认从0开始,然后往下递增1
3. green
4. white
5. black
6. }

8. fn main() {
9. mut c := Color.green // 第一次定义要使用:枚举名称.枚举值
10. println(c) // 输出green
11. c = Color.blue
12. c = .blue // 第二次修改赋值,也可以忽略枚举名称,直接使用.枚举值就可以了
13. println(c) // 输出blue
14. }

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

1. enum Color2 {
2. blue = 2 //可以指定初始值
3. green
4. white
5. black
6. }

8. enum Color3 {
9. blue = -4 //初始值也可以是负数
10. green
11. white
12. black
13. }

15. fn main() {
16. mut c := Color2.green
17. println(c) //输出green
18. c = .blue
19. println(c) //输出blue
20. }

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

1. enum W_hex {
2. a = 0x001 //枚举值也支持16进制
3. b = 0x010
4. c = 0x100
5. }

7. fn main() {
8. println(W_hex.a) //输出a
9. println(W_hex.b) //输出b
10. println(W_hex.c) //输出c
11. }

枚举方法

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

1. enum Color {
2. red = 1
3. green
4. blue
5. black
6. white
7. }

9. fn (c Color) is_blue() bool { // 枚举方法
10. return c == .blue
11. }

13. fn main() {
14. b := Color.blue
15. if b.is_blue() {
16. println('yes')
17. println(b)
18. } else {
19. println('no')
20. println(b)
21. }
22. }

枚举值/整型相互转换

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

1. enum Color {
2. red = 1
3. green
4. blue
5. black
6. white
7. }

9. fn main() {
10. i := 3 // 推断为int
11. // println(i==.blue)     //报错,类型不匹配
12. e := Color(i) // 转换为枚举类型
13. println(e == .blue) // 输出true
14. ii := int(e) // 枚举类型转换为int
15. println(ii) // 输出3
16. iii := e // iii是枚举类型
17. println(typeof(iii).name)
18. println(iii)
19. }

枚举类型数组

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

1. struct Abc {
2. mut:
3. flags []Flag
4. }

6. enum Flag {
7. flag_one
8. flag_two
9. flag_three
10. }

12. fn main() {
13. mut a := Abc{}
14. a.flags << .flag_one
15. a.flags << .flag_two
16. a.flags << .flag_three
17. println(a.flags)
18. }

枚举注解

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

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

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