05 Rust 结构体

结构体

Rust 中的结构体(Struct)与元组(Tuple)都可以将若干个类型不一定相同的数据捆绑在一起形成整体,但结构体的每个成员和其本身都有一个名字,这样访问它成员的时候就不用记住下标了。

元组常用于非定义的多值传递,而结构体用于规范常用的数据结构。结构体的每个成员叫做"字段"。

// 引入调试库用于输出结构体
#[derive(Debug)]
struct Person {
    name: String,
    age: u8,
}

// 结构体 impl 块可以写几次,效果相当于它们内容的拼接!
impl Person {
    // 结构体方法
    fn sayhello(&self) {
        println!("Hello I am {}, {}", self.name, self.age);
    }

    // 结构体关联函数, 没有 &self 参数, 不依赖实例
    fn create(name: String, age: u8) -> Person {
        // 当 value 和 key 名称相同, 可简写
        let p = Person { name: name, age };
        p
    }
}

fn main() {

    let mut p1 = Person::create("Jim".to_string(), 18);
    p1.age += 1;
    p1.sayhello();

    // 更新部分, 其余一致
    let p2 = Person {
        name: "Tom".to_string(),
        ..p1
    };

    // 使用占位符 {:#?} 或 {:?} 输出结构体 
    println!("{:#?}", p2);
}

元组结构

struct Color(i32, i32, i32);

let black = Color(0, 0, 0);

单元类结构

单元类结构是没有任何字段的结构体

struct Unit;
let u = Unit;

结构数据的所有权

结构体必须掌握字段值所有权,因为结构体失效的时候会释放所有字段。这就是为什么本章的案例中使用了 String 类型而不使用 &str 的原因。

但这不意味着结构体中不能定义引用型字段,这需要通过"生命周期"机制来实现。但现在还难以说明"生命周期"概念,所以只能在后面章节说明。

你可能感兴趣的:(rust,开发语言,后端)