【Rust 笔记】07-结构体

本文介绍了Rust语言中的结构体概念及其三种类型:命名字段结构体、类元组结构体和类基元结构体。详细解释了如何定义和使用这些结构体,并探讨了结构体布局、方法定义、泛型结构体等内容。

07 - 结构体

  • Rust 结构体,也称结构,等同于 C/C++ 中的 struct 类型、Python 中的类和 JavaScript 中的对象。
  • 结构体把各个类型的值聚集为一个值,以便作为一个整体(集合)来处理。
  • Rust 有 3 种结构体类型。
    • 命名字段(named-field)结构体:每个组件都有一个名字。
    • 类元组(tuple-like)结构体:以组件出现的次序标记它们。
    • 类基元(unit-like)结构体:根本没有组件。

7.1 - 命名字段结构体

  • 命名字段结构体的定义:

    /// 8位灰阶像素的矩形
    struct GrayscaleMap {
         
         
        pixels: Vec<u8>,
        size: (usize, usize)
    }
    
  • 结构体的命名约定:

    • 驼峰拼写法(CamelCase):每个单词的首字母要大写。
    • 蛇形拼写法(snake_case):字段和方法的名字要小写,单词间以下划线分割。
  • 结构体表达式(struct expression):用于创建结构体的值。

    let width = 1024;
    let height = 576;
    let image = GrayscaleMap {
         
         
      pixels: vec![0; width * height],
      size: (width, height)
    };
    
  • 访问结构体中的字段:使用. 操作符。

  • 结构体默认是私有的,只在声明它的模块中可见。结构体中的字段默认也是私有的。

  • 如果要让结构体对模块外部可见,需要在它的定义之前加上 pub 关键字。

  • 公有结构体,其字段仍然可以私有。

    • 其他模块可以使用这个结构体以及它的任何公有方法
    • 但是不能通过名字访问其私有字段
    • 也不能使用结构体表达式创建新的结构体值
  • 创建命名字段结构体的值:

    • 创建结构体值要求结构体的所有字段都必须是可见的。
    • 创建命名字段结构体值时,可以使用另一个相同类型的结构体来提供省略的字段值。
  • 在结构体表达式中,假设 EXPR 是结构体类型的值,如果命名字段结构体后面跟着..EXPR,那么任何没有出现的字段都将从 EXPR 中取得自己的值。

    struct Broom {
         
         
      name: String,
      height: u32,
      health: u32,
      position: (f32, f32, f32),
      intent: BroomIntent
    }
    
    // 扫帚(Broom)可以做copy和clone操作
    #[derive(Copy, Clone)]
    enum BroomIntent {
         
         
      FetchWater,
      DumpWater
    }
    
    // 按值接收Broom,取得所有权
    fn chop(b: Broom) -> (Broom, Broom) {
         
         
      // 基于b初始化broom1,只修改height。因为String不是可复制类型。
      // 所以broom1取得b名字的所有权
      let mut broom1 = Broom {
         
         
        height: b.height / 2,
        ..b
      };
    
      // 基于broom1初始化broom2。因为String不是可复制类型。
      // 所以必须显示地克隆name
      let mut broom2 = Broom {
         
         
        name: broom1.name.clone(),
        ..broom1
      };
    
      // broom1和broom2起不同的别名
      broom1.name.push_str(" I");
      broom2.name.push_str(" II");
    
      (broom1, broom2)
    }
    
    fn main() {
         
         
      let hokey = Broom {
         
         
        name: "Hokey".to_string(),
        height: 60,
        health: 100,
        position: (100.0, 200.0, 0.0),
        intent: BroomIntent::FetchWater
      };
    
      let (hokey1, hokey2) = chop(hokey);
    
      println!("{}", hokey1.name);      // "Hokey I"
      println!("{}", hokey1.health);    // 100
    
      println!("{}", hokey2.name);      // "Hokey II"
      println!("{}"
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

phial03

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值