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
}
}
本文由 yuin 创作,
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。