[rust]元组结构体

3 阅读1分钟

元组结构体和经典结构体的区别

  1. 元组结构体:字段没有名称,通过索引访问,适合简单数据封装
  2. 经典结构体:字段有名称,通过名称访问,适合复杂数据结构

定义

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);
}