Rust---复合数据类型之结构体

目录

  • 结构体的使用
    • 输出结果
  • 结构体简化创建
  • 结构体更新语法
  • 元组结构体
  • 单元结构体(unit struct)
  • 结构体中的引用
  • 使用#[derive(Debug)]
    • 再次介绍
  • 代码综合展示

与元组不同的是,结构体可以为内部的每个字段起一个富有含义的名称,因此无需依赖这些字段的顺序就可以来访问和解析它们。

结构体的使用

// 定义一个结构体 Person
struct Person {name: String,age: u32,
}// 为 Person 结构体实现方法
impl Person {fn greet(&self) {println!("Hello, my name is {}.", self.name);}
}fn main() {// 创建一个 Person 结构体实例let mut person1 = Person {name: String::from("Alice"),age: 30,};// 修改 Person 结构体字段// 必须要将结构体实例声明为可变的,才能修改其中的字段,Rust 不支持将某个结构体某个字段标记为可变。person1.name = String::from("Amy");// 访问 Person 结构体字段println!("Name: {}", person1.name);println!("Age: {}", person1.age);// 调用 Person 结构体方法person1.greet();
}

输出结果

在这里插入图片描述

结构体简化创建

fn build_user(email: String, username: String) -> User {User {email,//当函数参数和结构体字段同名时,可以直接使用缩略的方式进行初始化username,//当函数参数和结构体字段同名时,可以直接使用缩略的方式进行初始化active: true,sign_in_count: 1,}
}

结构体更新语法

  • .. 语法表明凡是我们没有显式声明的字段,全部从 user1 中自动获取。
  • 需要注意的是 ..user1 必须在结构体的尾部使用。
  let user2 = User {email: String::from("another@example.com"),..user1};
  • 结构体更新语法跟赋值语句 = 非常相像,结果是,username 所有权被转移给了 user2,导致了 user1 无法再被使用。
  • 把结构体中具有所有权的字段转移出去后,将无法再访问该字段,但是可以正常访问其它的字段。

元组结构体

  • 元组结构体在某些情况下比普通结构体更方便,特别是当您只需要一个简单的数据结构来存储几个字段时。元组结构体可以帮助您更清晰地表达代码的意图,并且具有元组的轻量性和灵活性。
  • 结构体的字段可以没有名称,这种结构体长得很像元组。
// 定义一个类似元组的结构体 Color,表示颜色
struct Color(i32, i32, i32);// 定义一个类似元组的结构体 Point,表示三维空间中的点
struct Point(i32, i32, i32);fn main() {// 创建一个 Color 结构体实例,表示黑色let black = Color(0, 0, 0);// 创建一个 Point 结构体实例,表示原点let origin = Point(0, 0, 0);// 访问 Color 结构体的字段println!("Black: ({}, {}, {})", black.0, black.1, black.2);// 访问 Point 结构体的字段println!("Origin: ({}, {}, {})", origin.0, origin.1, origin.2);
}

单元结构体(unit struct)

  • 它不包含任何字段。单元结构体的定义非常简单,只是由结构体关键字 struct 后面跟结构体的名称构成,例如:
struct UnitStruct;
  • 单元结构体在 Rust 中主要用于表示不需要存储数据的类型,通常用作占位符、类型标记或模块化设计中的辅助类型。

结构体中的引用

  • 如果想在结构体中使用一个引用,就必须加上生命周期。
  • 生命周期能确保结构体的作用范围要比它所借用的数据的作用范围要小。

使用#[derive(Debug)]

  • 如果使用 {} 来格式化输出,那对应的类型就必须实现 Display 特征,结构体不默认实现 Display 特征。因此下面的代码会报错:
struct Rectangle {width: u32,height: u32,
}fn main() {let rect1 = Rectangle {width: 30,height: 50,};println!("rect1 is {}", rect1);
}
  • 如果改为:println!("rect1 is {:?}", rect1);
// 会提醒我们没有实现debug特征
error[E0277]: `Rectangle` doesn't implement `Debug`
  • 正确使用方法:
#[derive(Debug)]// 加上这一个东西
struct Rectangle {width: u32,height: u32,
}fn main() {let rect1 = Rectangle {width: 30,height: 50,};println!("rect1 is {:?}", rect1);
}

再次介绍

  • Rust 中,#[derive(Debug)] 是一个非常方便的属性,用于自动实现 Debug traitDebug trait 是一个用于打印调试信息的 trait,通过实现这个 trait,可以使用 println!("{:?}", variable); 这样的方式来输出变量的调试信息,而不需要手动实现 Debug traitfmt 方法。
  • #[derive(Debug)] 的使用可以简化代码,并让我们更方便地输出结构体、枚举等类型的调试信息。

代码综合展示

// 定义一个结构体 Person
struct Person {name: String,age: u32,
}// 为 Person 结构体实现方法
impl Person {fn greet(&self) {println!("Hello, my name is {}.", self.name);}
}// 定义一个元组结构体 Point
struct Point(i32, i32);// 定义一个结构体 Rectangle,并衍生 Debug 特性
#[derive(Debug)]
struct Rectangle {width: u32,height: u32,
}fn main() {// 创建一个 Person 结构体实例let person1 = Person {name: String::from("Alice"),age: 30,};// 访问 Person 结构体字段println!("Name: {}", person1.name);println!("Age: {}", person1.age);// 调用 Person 结构体方法person1.greet();// 创建一个可变 Person 结构体实例let mut person2 = Person {name: String::from("Bob"),age: 25,};// 修改 Person 结构体字段person2.age = 26;// 创建一个元组结构体实例let origin = Point(0, 0);// 创建一个 Rectangle 结构体实例let rect = Rectangle {width: 10,height: 20,};// 打印 Rectangle 结构体实例,使用 Debug 特性println!("{:?}", rect);
}

输出结果:【这个警告实在是不知道怎么修改,明明已经使用println!("{:?}", variable);了】
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/588883.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

llama.cpp运行qwen0.5B

编译llama.cp 参考 下载模型 05b模型下载 转化模型 创建虚拟环境 conda create --prefixD:\miniconda3\envs\llamacpp python3.10 conda activate D:\miniconda3\envs\llamacpp安装所需要的包 cd G:\Cpp\llama.cpp-master pip install -r requirements.txt python conver…

2-PS修改图片颜色

【问题介绍】PS 快速改变图片颜色,可以生成一个系列的可爱作品 如下图,一个可爱的白色云朵蓝色背景 蓝白色冰淇淋 如果我们想要改一改颜色,做出一个系列的绿色冰淇淋、粉色冰淇淋呢? 方法1 【最简单】图像→替换颜色 调整后效果…

Rust vs C++:2024,谁更懂错误处理?

讲动人的故事,写懂人的代码 「席双嘉,听说你的C++项目又因为忘了检查返回值导致内存泄漏,又加班了?」 周五中午,在国内某科技巨头熙熙攘攘的员工餐厅,贾克强半开玩笑地戳了戳坐在隔壁的席双嘉,眼神中满是戏谑。 贾克强,一个热衷于Rust的程序员,总是乐于挑战和探索新…

网站保安大作战:HTML代码加固技术攻略

引言 HTML是网站开发的基础语言,它的安全性直接关系到网站的安全性。为了保障网站的安全性,我们需要加固HTML代码。本文将介绍一些具体方法,帮助你加固HTML代码,提高网站的安全性。 摘要 本文将介绍以下几种方法来加固HTML代码…

36.not comply with the UI component syntax不允许在UI描述里直接使用

不允许在UI描述里直接使用&#xff0c;但可以在方法或者函数里使用 not comply with the UI component syntax. <etsLint> 这里ok:

商标撤销,华为还能“遥遥领先“吗?

华为不再"遥遥领先"? 去年 9 月&#xff0c;华为技术有限公司申请注册两枚「遥遥领先」商标&#xff0c;国际分类为「科学仪器」和「运输工具」。 今年 1 月 20 日&#xff0c;商标流程信息显示&#xff0c;上述两枚商标被撤回注册申请&#xff0c;当前为无效状态。…

openGauss学习笔记-254 openGauss性能调优-使用Plan Hint进行调优-子链接块名的hint

文章目录 openGauss学习笔记-254 openGauss性能调优-使用Plan Hint进行调优-子链接块名的hint254.1 功能描述254.2 语法格式254.3 参数说明254.4 示例 openGauss学习笔记-254 openGauss性能调优-使用Plan Hint进行调优-子链接块名的hint 254.1 功能描述 指明子链接块的名称。…

根据用户角色权限,渲染菜单的一个问题记录

个人博客&#xff1a;无奈何杨&#xff08;wnhyang&#xff09; 个人语雀&#xff1a;wnhyang 共享语雀&#xff1a;在线知识共享 Github&#xff1a;wnhyang - Overview 背景 之前一直讲过自己独立在做一个中后台管理系统&#xff0c;当然这个只是开始&#xff0c;未来会基…

IP地址如何修改?分享操作技巧

在互联网世界中&#xff0c;IP地址是每台计算机或网络设备的唯一标识&#xff0c;它决定了设备在网络中的位置以及与其他设备的通信方式。然而&#xff0c;有时出于特定需求&#xff0c;我们可能需要修改设备的IP地址。虎观代理将详细阐述如何修改IP地址&#xff0c;并探讨在修…

通过nvtx和Nsight Compute分析pytorch算子的耗时

通过nvtx和Nsight Compute分析pytorch算子的耗时 一.效果二.代码 本文演示了如何借助nvtx和Nsight Compute分析pytorch算子的耗时 一.效果 第一次执行,耗时很长 小规模的matmul,调度耗时远大于算子本身 大规模的matmul,对资源的利用率高小规模matmul,各层调用的耗时 二.代码…

RuntimeError: Error compiling objects for extension虚拟环境和系统环境——添加、删除、修改环境变量

前言&#xff1a;因为一个报错RuntimeError: Error compiling objects for extension 没有配置cl.exe环境变量&#xff0c;我的应用场景是需要搞定虚拟环境变量配置 RuntimeError: Error compiling objects for extension手把手带你解决&#xff08;超详细&#xff09;-CSDN博…

RJ61BT11 三菱iQ-R系列CC-Link系统主站/本地站模块

RJ61BT11 三菱iQ-R系列CC-Link系统主站/本地站模块 RJ61BT11参数说明&#xff1a;CC-Link Ver.2版本&#xff0c;主站/本地站 三菱iQ-R系列CC-Link系统主站/本地站模块RJ61BT11产品规格&#xff1a; [传送速度] 156K/625K/2.5M/5M/l0Mbps(可选) [最多连接个数(主站时)] 64个 …