【百例RUST - 007】结构体

【百例RUST - 007】结构体

第一章 结构体基础用法

第01节 定义结构体

格式

复制代码
struct  结构体名称 {
	字段名称1 : 字段类型,
	字段名称2 : 字段类型,
	字段名称3 : 字段类型,
}

案例

rust 复制代码
struct User {
    name: String,
    count: String,
    nonce:u64,
    active: bool,
}

第02节 构建实例

构建不可变的实例(只读)

格式

复制代码
struct 实例名称 = 结构体名称 {
	字段名称1 : 字段值1,
	字段名称2 : 字段值2,
	字段名称3 : 字段值3,
}

代码

rust 复制代码
// 创建结构体实例
let xiaoming = User {
    name: String::from("xiaoming"),
    count: String::from("80001000"),
    nonce: 10000,
    active: true,
};
构建可变的实例(可修改)

格式

复制代码
struct mut 实例名称 = 结构体名称 {
	字段名称1 : 字段值1,
	字段名称2 : 字段值2,
	字段名称3 : 字段值3,
}

代码

rust 复制代码
// 创建结构体实例
let mut xiaohuang = User {
    name: String::from("xiaoming"),
    count: String::from("80001000"),
    nonce: 10000,
    active: true,
};

第03节 获取值

案例代码1:

rust 复制代码
fn main(){
    
    // 定义结构体
    struct User{
        name: String,
        count: String,
        nonce:u64,
        active: bool,
    }
    
    // 构建实例
    let xiaoming = User {
        name: String::from("xiaoming"),
        count: String::from("80001000"),
        nonce: 10000,
        active: true,
    };
    
    // 获取值
    println!("name = {}", xiaoming.name);  // name = xiaoming
}

案例代码2:

rust 复制代码
fn main(){
    
    // 定义结构体
    struct User{
        name: String,
        count: String,
        nonce:u64,
        active: bool,
    }
    
    // 构建实例
    let xiaoming = User {
        name: String::from("xiaoming"),
        count: String::from("80001000"),
        nonce: 10000,
        active: true,
    };
     
    // 获取值, 存储到变量中
    let value_count = xiaoming.count;
    println!("value_count = {}", value_count);  // value_count = 80001000
    
    // println!("count = {}", xiaoming.count); // 注意上面出现了所有权的 MOVE 不能使用了
}

第04节 修改值

案例代码1:

rust 复制代码
fn main(){
    
    // 定义结构体
    struct User{
        name: String,
        count: String,
        nonce:u64,
        active: bool,
    }
    
    // 构建实例  不可变的结构体
    let xiaoming = User {
        name: String::from("xiaoming"),
        count: String::from("80001000"),
        nonce: 10000,
        active: true,
    };
    
    // 修改变量
    xiaoming.count = String::from("301000");       // 这里直接修改值, 会报错!因为当前是不可变的结构体
    println!("xiaoming.count = {}", xiaoming.count);  
}

案例代码2:

rust 复制代码
fn main(){
    
    // 定义结构体
    struct User{
        name: String,
        count: String,
        nonce:u64,
        active: bool,
    }
    
    // 构建实例  可变的结构体
    let mut xiaoming = User {
        name: String::from("xiaoming"),
        count: String::from("80001000"),
        nonce: 10000,
        active: true,
    };
    
    // 修改变量
    xiaoming.count = String::from("301000");
    println!("xiaoming.count = {}", xiaoming.count);  // xiaoming.count = 301000
}

第二章 其他方式构建结构体

第01节 参数名称和字段名同名

rust 复制代码
fn main(){
    
    // 定义结构体
    struct User{
        name: String,
        count: String,
        nonce:u64,
        active: bool,
    }
    
    let name   = String::from("xiaohong");
    let count  = String::from("80001000");
    let nonce  = 10000;
    let active = true;
    
    
    // 构建实例, 这里可以简化书写
    let xiaohong = User { name, count, nonce, active};
    
    // 输出
    println!("name = {}", xiaohong.name);  // name = xiaohong
}

第02节 从其他结构体创建实例

案例代码1

所有属性,完全照抄

rust 复制代码
fn main(){
    
    // 定义结构体
    struct User{
        name: String,
        count: String,
        nonce:u64,
        active: bool,
    }
    
    let xiaoming = User {
        name: String::from("xiaoming"),
        count: String::from("80010010"),
        nonce: 1000,
        active: true,
    };
    
    
    // 构建实例
    let xiaohong = User { 
        ..xiaoming
    };
    
    // 输出
    println!("count = {}", xiaohong.count);  // count = 80010010
}

案例代码2

部分属性,自己定义,其他属性照抄

rust 复制代码
fn main(){
    
    // 定义结构体
    struct User{
        name: String,
        count: String,
        nonce:u64,
        active: bool,
    }
    
    let xiaoming = User {
        name: String::from("xiaoming"),
        count: String::from("80010010"),
        nonce: 1000,
        active: true,
    };
    
    
    // 构建实例
    let xiaohong = User {
        name: String::from("xiaohong"),
        ..xiaoming
    };
    
    // 输出
    println!("name = {}", xiaohong.name);  // name = xiaohong
}

第03节 元组结构体

rust 复制代码
fn main(){
    
    // 定义结构体
    struct Point(i32, i32);
 
    // 创建结构体实例
    let a = Point(10, 20);
    let b = Point(30, 50);
    
    // 输出
    println!("a.x = {}  b.y={}", a.0, b.1);  // a.x = 10  b.y=50
}

第04节 没有任何字段的类单元结构体

rust 复制代码
fn main(){
    
    // 定义结构体
    struct A{ };
  
}

第三章 打印结构体

第01节 打印在一行

rust 复制代码
fn main(){
    
    // 创建结构体类型
    #[derive(Debug)]     // 这里需要加上宏
    struct User{
        name: String,
        count: String,
        nonce:u64,
        active: bool,
    }
    
    
    // 创建结构体实例
    let xiaoming = User{
        name: String::from("xiaoming"),
        count: String::from("80001000"),
        nonce: 10000,
        active: true,
    };
    
    // 打印结构体, 打印在一行的写法
    println!("xiaoming = {:?}", xiaoming); 
  
}

 // xiaoming = User { name: "xiaoming", count: "80001000", nonce: 10000, active: true }

第02节 打印在多行

rust 复制代码
fn main(){
    
    // 创建结构体类型
    #[derive(Debug)]     // 这里需要加上宏
    struct User{
        name: String,
        count: String,
        nonce:u64,
        active: bool,
    }
    
    
    // 创建结构体实例
    let xiaoming = User{
        name: String::from("xiaoming"),
        count: String::from("80001000"),
        nonce: 10000,
        active: true,
    };
    
    // 打印结构体, 打印在多行的写法
    println!("xiaoming = {:#?}", xiaoming);  
  
}

// xiaoming = User {
//     name: "xiaoming",
//     count: "80001000",
//     nonce: 10000,
//     active: true,
// }
相关推荐
我命由我123452 分钟前
5-2.Python 编码进阶 - 字符串进阶(拼接、普通格式化、普通格式化数字精度控制、快速格式化、遍历、常用方法)
java·开发语言·后端·python·学习·java-ee·学习方法
风骏时光牛马4 分钟前
大模型底层架构与推理机制源码深度剖析
前端
java1234_小锋5 小时前
【技术专题】HTML5 网页技术 - HTML5 Canvas 基础以及动画入门
前端·html·html5
Pniubi8 小时前
HashMap的扩容和树化边界
java·开发语言
Mikko78 小时前
用 Java 复刻了高中时在塞班上玩的「熔岩矿车」:纯 Swing、零依赖、没有一张图片,一个 jar 双击就能玩
java·游戏开发·swing
知了学历孙老师8 小时前
小自考的校考和统考,出题方和难度差在哪
java·大数据·前端
Java爱好狂.9 小时前
Java初学者如何一周速通SpringBoot!
java·spring boot·后端·spring·高并发·架构师·java面试
秋饼9 小时前
LLM API密钥动态轮换实战:Spring Vault + Spring AI + 多Provider路由
java·ai·技术分享·后端开发
ShineWinsu10 小时前
对于JavaScript:操作元素的解析
开发语言·前端·javascript·面试·web·dom·元素
福兮说11 小时前
JSON 格式正确,数据就可靠吗?我用一份自编配置检查类型与空值
java·前端·json