• Rust结构体和枚举类


    Rust初步上手所有权

    元组结构体

    元组结构体是最简单的结构体,可以粗暴地理解为是有名字的元组,二者的区别如下。

    let tup: (i32, f64, u8) = (500, 6.4, 1);
    
    struct Test(i32, f64, u8);
    let t = Test(500,6.4,1)
    
    • 1
    • 2
    • 3
    • 4

    第一行代码将一个元组绑定给变量tup,而tup要求三个位置的变量分别是32位整型、双精度以及8位无符号整型。

    而元组结构体则首先需要有一个名字,通过struct声明结构体并给定不同位置处的数据类型后,再调用结构体的构造函数Test,来新建一个元组结构体,最后绑定给变量t。

    结构体

    完整的结构体,不仅本身有名字,结构体中的成员也可以有名字,并且可以定义成员方法,下面做一个简单的示例。

    #[derive(Debug)]
    struct Person{
        name: String,
        age : u8
    }
    
    impl Person{
        fn say_hello(){
            println!("Hello, world!");
        }
        fn self_intro(&self){
            println!("I'm {}, {} years old", 
                self.name, self.age);
        }
    }
    
    fn main(){
        let john = Person{name: String::from("John"), age:12};
        Person::say_hello();
        john.self_intro();
        println!("{:?}",john);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    编译后运行结果如下。

    >rustc struct.rs
    >struct.exe
    Hello, world!
    I'm John, 12 years old
    Person { name: "John", age: 12 }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    首先,创建结构体时,其内部结构需要用花括号包裹,并且指定结构体成员的名称和数据类型。

    然后,通过impl为结构体绑定成员方法,尽管仍旧通过fn来作为方法的标识,但若调用结构体成员,必须将&self作为结构体的输入参数;如果不添加&self,则被称为关联函数。

    最后,结构体在实例化时,通过冒号来绑定成员名和具体的值。其成员方法(有&self参数)由实例来调用,并且省略参数&self;而关联函数则通过结构体的名称和双冒号来调用。

    上面的代码除了展示结构体及其成员方法的定义与构造之外,还在println!中使用了"{:?}"形式的占位符,用于更便捷地打印结构体及其成员。

    枚举类

    枚举是一个非常经典的编程概念了,理解起来没有难度,但Rust为其适配了match语法,使得枚举类变得有了一些可玩性。

    #[derive(Debug)]
    
    enum Person {
        Boy{beard_length: u32}, 
        Girl{hair_color: String}
    }
    
    fn main() {
        let john = Person::Boy{beard_length:5};
        let amy = Person::Girl{hair_color:String::from("red")};
        println!("{:?}\n{:?}", john, amy);
        match john {
            Person::Boy { beard_length } => {
                println!("{}cm", beard_length);
            },
            Person::Girl { hair_color } => {
                println!("{} hair", hair_color);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    运行结果如下

    >enum.exe
    Boy { beard_length: 5 }
    Girl { hair_color: "red" }
    5cm
    
    • 1
    • 2
    • 3
    • 4

    上面代码中,首先定义了一个枚举类Person,其内部有两个成员,分别是Boy和Girl,其中每一个都是结构体,Boy有一个成员是胡子的长度,Girl封装了一个成员是头发的颜色。

    然后在main函数中,分别将枚举类实例化为john和amy。

    最后,使用了match语法,如果john是Boy,就取出其中的beard_length,并打印;如果是Gril,就取出其中的hair_color,同样打印出来。

    在这里插入图片描述

  • 相关阅读:
    C语言——运算符
    一种改进的混合阿奎拉鹰和哈里斯鹰优化算法
    IDEA项目初始化编码
    技术干货 | MindSpore AI科学计算系列(四):AlphaFold2分析
    【数电】IEEE754浮点数
    layui.msg第一次弹出的提示很长
    程序员的精力管理
    ElasticSearch - DSL查询文档语法,以及深度分页问题、解决方案
    liunx 搭建 zookeeper
    linux字符串截取
  • 原文地址:https://blog.csdn.net/m0_37816922/article/details/132611842