认识Rust中的Struct
   笔记Rust基础    0 comment
认识Rust中的Struct
   笔记Rust基础    0 comment

struct

1 struct定义

struct或structure是一种自定义数据类型,可让您将多个相关值打包并命名,从而组成一个有意义的组。

2 struct示例

什么时候使用struct似乎是一个关键的问题,当我们需要对一些关联的数据进行处理的时候,我们往往希望把它们构建为一组数据。使用struct构建一组数据作为一个参数,更利于维护和可读性。以下以计算矩形面积为例展示struct的简单使用:

    #[derive(Debug)]
    struct Rectangle {
        width: u32,
        height: u32,
    }

    fn main(){
        let rect = Rectangle {
            width;30,
            height;50,
        };
        //传递参数为rect的不可变借用,因此在main中后续依旧可以使用react
        println("{}",area(&rect));
        println("{:?}",rect);
         // 对于结构,格式化输出的方式 println!就不那么清晰了,因为有更多的显示可能性,
    }

    //定义计算面积的函数
    fn area(rect: Rectangle) -> u32 {
        rect.width * rect.height
    }

3 struct方法

方法类似于函数,都是用fn关键字声明,都可以有参数和返回值。但不同的是方法是在结构体的上下文中定义的,并且他的第一个参数始终是self,即该结构体实例本身。

根据2的实例,来使用struct方法改写,我们可以那计算面积的方法作为Rectangle内部的方法

    #[derive(Debug)]
    struct Rectangle {
        width: u32,
        height: u32,
    }

    impl Rectangle {
    //定义Rectangle实例下的方法
    //参数为该Rectangle实例本身
    fn area(&self) -> u32 {
        self.width * self.height
    }
    }

    fn main(){
        let rect = Rectangle {
            width:30,
            height:50,
        };
        //rect是Rectangle的一个实例,而在Rectangle的实例上定义的有area()方法,因此调用方法时直接通过rect.funcName
        println!("{}",rect.area());
        println!("{:?}",rect);
    }

4 更多参数的方法

如果我们使用let定义多个Rectangle的实例(多个矩形),通过一个方法判断矩形间是否能够容纳。很明显这个方法应该有不少于两个的参数,且每一个参数都应该是矩形的一组数据。

    #[derive(Debug)]
    struct Rectangle {
        width: u32,
        height: u32,
    }
    impl Rectangle {
        //定义判断是否容纳的方法,接受两个参数
        //第一个永远都是self,就是调用方法实例本身,在这里指rect1
        fn can_hold(&slef,other: &Rectangle) -> bool {
            self.width > other.width && self.height > other.height
        }
    }

    fn main(){
        let rect1 = Rectangle {
            width:30,
            height:50,
        };
        let rect2 = Rectangle {
            width:35,
            height:55,
        };
        let rect3 = Rectangle {
            width:25,
            height:50,
        };
        println!("{}",rect1.can_hold(&rect2));
        println!("{}",rect1.can_hold(&rect3));
    }

5 其他注意项目

每个struct允许有多个impl块,比如可以将计算面积和判断是否容纳的方法定义在两个不同读的impl块中


impl Rectangle {
fn area(&self) -> u32 {
self.width * self.height
}
}
impl Rectangle {
fn can_hold(&self, other: &Rectangle) -> bool {
self.width > other.width && self.height > other.height
}
}
The article has been posted for too long and comments have been automatically closed.