枚举
定义枚举
枚举默认是模块内访问,通过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. }
关于注解的进一步使用,可以参考注解章节
