首页
chatGPT
关于
友链
其它
统计
更多
壁纸
留言
Search
1
cgroup--(4)cgroup v1和cgroup v2的详细介绍
6,535 阅读
2
修改Linux Kernel defconfig的标准方法
6,447 阅读
3
Android系统之VINTF(1)manifests&compatibility matrices
6,054 阅读
4
使用git生成patch和应用patch
3,570 阅读
5
c语言的__attribute__
3,183 阅读
默认分类
文章收集
学习总结
算法
环境配置
知识点
入门系列
vim
shell
Git
Make
Android
Linux
Linux命令
内存管理
Linux驱动
Language
C++
C
Rust
工具
软件工具
Bug
COMPANY
登录
Search
标签搜索
Rust
shell
Linux
c
uboot
Vim
vintf
Linux驱动
Android
device_tree
git
DEBUG
arm64
链表
数据结构
IDR
内核
ELF
gcc
ARM
adtxl
累计撰写
380
篇文章
累计收到
16
条评论
首页
栏目
默认分类
文章收集
学习总结
算法
环境配置
知识点
入门系列
vim
shell
Git
Make
Android
Linux
Linux命令
内存管理
Linux驱动
Language
C++
C
Rust
工具
软件工具
Bug
COMPANY
页面
chatGPT
关于
友链
其它
统计
壁纸
留言
搜索到
35
篇与
的结果
2024-12-10
Rust程序设计学习笔记(4)--使用结构体组织关联数据
仅是一些笔记,完整的rust学习文档详见https://rustwiki.org/zh-CN/book/title-page.html1. 定义并实例化结构体定义结构体,需要使用 struct 关键字并为整个结构体提供一个名字。结构体的名字需要描述它所组合的数据的意义。接着,在大括号中,定义每一部分数据的名字和类型,我们称为 字段(field)。struct User { active: bool, username: String, email: String, sign_in_count: u64, } 要在定义结构体后使用它,我们可以通过为每个字段指定具体值的方式来创建该结构体的实例。创建一个实例需要以结构体的名字开头,接着在大括号中使用 key: value 键-值对的形式提供字段,其中 key 是字段的名字,value 是需要存储在字段中的数据值。实例中字段的顺序不需要和它们在结构体中声明的顺序一致。换句话说,结构体的定义就像一个类型的通用模板,而实例则会在这个模板中放入特定数据来创建这个类型的值。struct User { active: bool, username: String, email: String, sign_in_count: u64, } fn main() { let mut user1 = User { email: String::from("someone@example.com"), username: String::from("someusername123"), active: true, sign_in_count: 1, }; user1.email = String::from("anotheremail@example.com"); } 使用结构体更新语法从其他实例创建实例使用旧实例的大部分值但改变其部分值来创建一个新的结构体实例通常很有用。这可以通过结构体更新语法(struct update syntax)实现。struct User { active: bool, username: String, email: String, sign_in_count: u64, } fn main() { // --snip-- let user1 = User { email: String::from("someone@example.com"), username: String::from("someusername123"), active: true, sign_in_count: 1, }; let user2 = User { email: String::from("another@example.com"), ..user1 }; } 代码创建了一个新实例 user2,该实例具有不同的 email 值,但 username、 active 和 sign_in_count 字段的值与 user1 相同。..user1 必须放在最后,以指定其余的字段应从 user1 的相应字段中获取其值,但我们可以选择以任何顺序为任意字段指定值,而不用考虑结构体定义中字段的顺序。使用没有命名字段的元组结构体来创建不同的类型也可以定义与元组类似的结构体,称为元组结构体(tuple struct)。元组结构体有着结构体名称提供的含义,但没有具体的字段名,只有字段的类型。当你想给整个元组取一个名字,并使元组成为与其他元组不同的类型时,元组结构体是很有用的,这时像常规结构体那样为每个字段命名就显得多余和形式化了。struct Color(i32, i32, i32); struct Point(i32, i32, i32); fn main() { let black = Color(0, 0, 0); let origin = Point(0, 0, 0); } 通过派生trait增加实用功能增加属性来派生 Debug trait,并使用调试格式打印 Rectangle 实例#[derive(Debug)] struct Rectangle { width: u32, height: u32, } fn main() { let rect1 = Rectangle { width: 30, height: 50, }; println!("rect1 is {:?}", rect1); } 2. 方法语法方法 与函数类似:它们使用 fn 关键字和名称声明,可以拥有参数和返回值,同时包含在某处调用该方法时会执行的代码。不过方法与函数是不同的,因为它们在结构体的上下文中被定义(或者是枚举或 trait 对象的上下文),并且它们第一个参数总是 self,它代表调用该方法的结构体实例。2.1 定义方法#[derive(Debug)] struct Rectangle { width: u32, height: u32, } impl Rectangle { fn area(&self) -> u32 { self.width * self.height } } fn main() { let rect1 = Rectangle { width: 30, height: 50, }; println!( "The area of the rectangle is {} square pixels.", rect1.area() ); } 为了使函数定义于 Rectangle 的上下文中,我们开始了一个 impl 块(impl 是 implementation 的缩写),这个 impl 块中的所有内容都将与 Rectangle 类型相关联。接着将 area 函数移动到 impl 大括号中,并将签名中的第一个(在这里也是唯一一个)参数和函数体中其他地方的对应参数改成 self。&self实际上是 self: &Self 的缩写。在一个 impl 块中,Self 类型是 impl 块的类型的别名。方法的第一个参数必须有一个名为 self 的Self 类型的参数,所以 Rust 让你在第一个参数位置上只用 self 这个名字来缩写。2.2 关联函数所有在 impl 块中定义的函数被称为关联函数(associated function),因为它们与 impl 后面命名的类型相关。我们可以定义不以 self 为第一参数的关联函数(因此不是方法),因为它们并不作用于一个结构体的实例。我们已经使用了一个这样的函数,String::from 函数,它是在 String 类型上定义的。关联函数经常被用作返回一个结构体新实例的构造函数。例如我们可以提供一个关联函数,它接受一个维度参数并且同时作为宽和高,这样可以更轻松的创建一个正方形 Rectangle 而不必指定两次同样的值:#[derive(Debug)] struct Rectangle { width: u32, height: u32, } impl Rectangle { fn square(size: u32) -> Rectangle { Rectangle { width: size, height: size, } } } fn main() { let sq = Rectangle::square(3); } 使用结构体名和 :: 语法来调用这个关联函数:比如 let sq = Rectangle::square(3);。这个方法位于结构体的命名空间中::: 语法用于关联函数和模块创建的命名空间。
2024年12月10日
4 阅读
0 评论
0 点赞
2024-12-10
Rust程序设计学习笔记(3)--认识所有权
仅是一些笔记,完整的rust学习文档详见https://rustwiki.org/zh-CN/book/title-page.html
2024年12月10日
6 阅读
0 评论
0 点赞
2024-12-09
Rust程序设计学习笔记(2)--通用编程概念
仅是一些笔记,完整的rust学习文档详见https://rustwiki.org/zh-CN/book/title-page.html
2024年12月09日
3 阅读
0 评论
0 点赞
2024-11-09
Rust程序设计学习笔记(1)--环境安装与导览
暂无简介
2024年11月09日
20 阅读
0 评论
0 点赞
2022-07-17
此内容被密码保护
加密文章,请前往内页查看详情
2022年07月17日
454 阅读
0 评论
0 点赞
2021-11-01
c语言中的#和##
暂无简介
2021年11月01日
704 阅读
0 评论
0 点赞
2021-03-17
C库函数-snprintf()
暂无简介
2021年03月17日
813 阅读
0 评论
0 点赞
2021-03-17
C库函数-sscanf()
暂无简介
2021年03月17日
642 阅读
0 评论
0 点赞
2021-03-16
C库函数-fgets()
暂无简介
2021年03月16日
741 阅读
0 评论
0 点赞
2021-03-10
CPP基础--表达式之类型转换
类型转换何时发生隐式类型转换在下面这些情况下,编译器会自动地转换运算对象的类型:在大多数表达式中,比int类型小的整型值首先提升为较大的整数类型。在条件中,非布尔值转换成布尔类型初始化过程中,初始值转换成变量的类型;在赋值语句中,右侧运算对象转换成左侧运算对象的类型如果算术运算关系或关系运算的运算对象有多种类型,则需要转换成同一种类型。函数调用时也会发生类型转换1. 算术转换算术转换的含义是把一种算术类型转换成另外一种算术类型。2. 其他隐式类型转换数组转换成指针在大多数用到数组的表达式中,数组自动转换成指向数组首元素的指针:int ia[10]; // 含有10个整数的数组 int* ip = ia; // ia转换成指向数组首元素的指针当数组被用作decltype关键字的参数,或者作为取地址符(&)、sizeof及typeid等运算符的运算对象时,上述转换不会发生。同样的,如果用一个引用来初始化数组,上述转换也不会发生。指针的转换C++还规定了其他的指针转换方式,包括常量整数值0或者字面值nullptr能转换成任意指针类型;指向任意非常量的指针能转换成void*;指向任意对象的指针能转换成const void*。转换成布尔类型存在一种从算术类型或指针类型向布尔类型自动转换的机制。如果指针或算术类型的值为0,转换结果是false;否则转换结果是true转换成常量允许将指向非常量类型的指针转换成指向相应的常量类型的指针,对于引用也是这样。3. 显式转换有时我们希望显式地将对象强制转换成另外一种类型。例如,如果想在下面的代码中执行浮点数除法;int i, j; double slope = i/j;就要使用某种方法将i或j显式地转换成double,这种方法称作强制类型转换(cast)。注:虽然有时不得不使用强制类型转换,但这种方法本质上是非常危险的。命名的强制类型转换一个命名的强制类型转换具有如下形式:cast-name<type>(expression);其中,type是转换的目标类型,而expression是要转换的值。如果type是引用类型,则结果是左值。cast-name是static_cast、dynamic_cast、const_cast和reinterpret_cast中的一种。cast-name指定了执行的是哪种转换。static_cast任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast。// 进行强制类型转换以便执行浮点数除法 double slope = static_cast<double>(j) / i;static_cast对于编译器无法自动执行的类型转换也非常有用。例如,我么可以使用static_cast找回存在于void*指针中的值:void* p = &d; // 正确:任何非常量对象的地址都能存入void* // 将void*转换回初始的指针类型 double *dp = static_cast<double*>(p);const_castconst_cast只能改变运算对象的底层const:const char *pc; char *p = const_cast<char*>(pc); //正确,但是通过p写值是未定义的行为对于将常量对象转换成非常量对象的行为,我们一般称其为“去掉const性质”。一旦我们去掉了某个对象的const性质,编译器就不能再阻止我们对该对象进行写操作了。如果对象本身不再是一个常量,使用强制类型转换获得写权限是合法的行为。然而如果对象是一个常量,再使用const_cast执行写操作就会产生未定义的后果。只有const_cast能改变表达式的常量属性,同样,const_cast不能用来改变表达式的类型。const_cast常常用于有函数重载的上下文中。reinterpret_castreinterpret_cast通常为运算对象的位模式提供较低层次上的重新解释。建议:避免强制类型转换,尤其是reinterpret_cast
2021年03月10日
891 阅读
0 评论
0 点赞
1
2
3
4