元组结构体和经典结构体的区别
- 元组结构体:字段没有名称,通过索引访问,适合简单数据封装
- 经典结构体:字段有名称,通过名称访问,适合复杂数据结构
定义
struct Color(i32, i32, i32);
fn main() {
let black = Color(0, 0, 0);
println!("Black color: ({}, {}, {})", black.0, black.1, black.2);
}
虽然元组结构体的字段没有名字,但是每个字段都有独立的特性,能够保证类型安全
允许泛型
struct Color<T, U>(T, U);
fn main() {
let black = Color(1, 2.222);
println!("Black color: ({}, {})", black.0, black.1);
}
与newType
模式结合
newType
模式:通过定义一个包含单个字段的元组结构体来封装已有类型,从而创建一个新的类型
struct Color(i32);
impl Color {
fn new(x: i32) -> Option<Color> {
if x > 0 {
Some(Color(x))
} else {
None
}
}
}
fn main() {
let black = Color::new(1);
match black {
None => { println!("None") }
Some(val) => { println!("Black color: ({})", val.0) }
}
}
实现特定的trait
与常规结构体一样,可以实现特定的trait
struct MyBox<T>(T);
impl<T> MyBox<T> {
fn new(x: T) -> MyBox<T> {
MyBox(x)
}
}
impl<T> Deref for MyBox<T> {
type Target = T;
fn deref(&self) -> &T {
&self.0
}
}
fn main() {
let x = MyBox::new(String::from("rust"));
println!("{}", *x);
}