南京市建设局网站栖霞,ui设计培训机构哪家好,创建网站是怎么赚钱的,漯河网站建设(千弘网络)系列文章目录
Rust 语言是一种高效、可靠的通用高级语言#xff0c;效率可以媲美 C / C 。本系列文件记录博主自学Rust的过程。欢迎大家一同学习。
Rust学习入门–【1】引言 Rust学习入门–【2】Rust 开发环境配置 Rust学习入门–【3】Cargo介绍 Rust学习入门–【4】Rust 输…系列文章目录
Rust 语言是一种高效、可靠的通用高级语言效率可以媲美 C / C 。本系列文件记录博主自学Rust的过程。欢迎大家一同学习。
Rust学习入门–【1】引言 Rust学习入门–【2】Rust 开发环境配置 Rust学习入门–【3】Cargo介绍 Rust学习入门–【4】Rust 输出到命令行 Rust学习入门–【5】源代码文件结构简介 Rust学习入门–【6】Rust 基础语法 Rust学习入门–【7】Rust 数据类型 Rust学习入门–【8】复合类型 Rust学习入门–【9】Rust 函数 Rust学习入门–【10】Rust 条件语句 Rust学习入门–【11】Rust 运算符 Rust学习入门–【12】Rust 循环 Rust学习入门–【13】Rust 字符串上 Rust学习入门–【14】Rust 字符串下 Rust学习入门–【15】Rust 所有权 Rust学习入门–【16】Rust 借用所有权 Borrowing / 引用 Rust学习入门–【17】Rust Slice切片类型 文章目录系列文章目录Rust 结构体结构体定义结构体实例也称为结构体初始化元组结构体结构体所有权输出结构体结构体方法结构体关联函数单元结构体Rust 结构体
Rust 中的结构体Struct与元组Tuple都可以将若干个不同类型的数据捆绑在一起形成整体但结构体的每个成员和其本身都有名字这样访问它成员的时候就不用记住下标了。
元组常用于非定义的多值传递而结构体用于规范常用的数据结构。结构体的每个成员叫做**“字段”**。
结构体定义 定义一个结构体的语法格式如下 struct Name_of_structure {field1:data_type,field2:data_type,field3:data_type
}结构体定义的例子 struct Site {domain: String,name: String,nation: String,found: u32
}注意如果你常用 C/C请记住在 Rust 里 struct 语句仅用来定义不能声明实例结尾不需要 ; 符号而且每个字段定义之后用 **, 分隔**。
结构体实例也称为结构体初始化
Rust 很多地方受 JavaScript 影响在实例化结构体的时候用 JSON 对象的 key: value 语法来实现定义 实例 let csdn Site {domain: String::from(www.csdn.com),name: String::from(CSDN),nation: String::from(China),
};从语法中可以看出初始化结构体时的等号右边就是把定义语法中的元素类型换成了具体的值。
结构体初始化其实就是对 结构体中的各个元素进行赋值。
如果你不了解 JSON 对象你可以不用管它记住格式就可以了
结构体类名 {字段名 : 字段值,...
}这样的好处是不仅使程序更加直观还不需要按照定义的顺序来输入成员的值。
如果正在实例化的结构体有字段名称和现存变量名称一样的可以简化书写 实例 let domain String::from(“www.csdn.com”); let name String::from(“CSDN”); let csdn Site { domain, // 等同于 domain : domain, name, // 等同于 name : name, nation: String::from(“China”), }; 有这样一种情况你想要新建一个结构体的实例其中大部分属性需要被设置成与现存的一个结构体属性一样仅需更改其中的一两个字段的值可以使用结构体更新语法
let site Site { domain: String::from(“www.csdn.com”), name: String::from(“CSDN”), …csdn }; 注意..csdn后面不可以有逗号。这种语法不允许一成不变的复制另一个结构体实例意思就是说至少重新设定一个字段的值才能引用其他实例的值。
元组结构体
有一种简单的定义和使用结构体的方式元组结构体。
元组结构体是一种形式是元组的结构体。
与元组的区别是它有名字和固定的类型格式。它存在的意义是为了处理那些需要定义类型经常使用又不想太复杂的简单数据
struct Color(u8, u8, u8); struct Point(f64, f64);
let black Color(0, 0, 0); let origin Point(0.0, 0.0); 颜色和点坐标是常用的两种数据类型但如果实例化时写个大括号再写上两个名字就为了可读性牺牲了便捷性Rust 不会遗留这个问题。元组结构体对象的使用方式和元组一样通过 . 和下标来进行访问
实例
fn main() {struct Color(u8, u8, u8);struct Point(f64, f64);let black Color(0, 0, 0);let origin Point(0.0, 0.0);println!(black ({}, {}, {}), black.0, black.1, black.2);println!(origin ({}, {}), origin.0, origin.1);
}运行结果 black (0, 0, 0) origin (0, 0) 结构体所有权
结构体必须掌握字段值所有权因为结构体失效的时候会释放所有字段。
本章的案例中使用了 String 类型而不使用 str 的。
但这不意味着结构体中不定义引用型字段这需要通过生命周期机制来实现。
输出结构体
调试中完整地显示出一个结构体实例是非常有用的。但如果我们手动的书写一个格式会非常的不方便。
Rust 提供了一个方便地输出一整个结构体的方法 实例 #[derive(Debug)]struct Rectangle {width: u32,height: u32,
}
fn main() {let rect1 Rectangle { width: 20, height: 40 };println!(rect1 is {:?}, rect1);
}如第一行所示一定要导入调试库 #[derive(Debug)] 之后在 println 和 print 宏中就可以用 {:?} 占位符输出一整个结构体 rect1 is Rectangle { width: 20, height: 40 } 如果属性较多的话可以使用另一个占位符 {:#?} 。 输出结果 rect1 is Rectangle {width: 20,height: 40
}结构体方法
方法Method和函数Function类似只不过它是用来操作结构体实例的。
Rust 语言不是面向对象的从它所有权机制的创新可以看出这一点。但是面向对象的珍贵思想可以在 Rust 实现。
结构体方法的第一个参数一定是 self不需声明类型因为 self 不是一种风格而是关键字。
计算一个矩形的面积 实例 struct Rectangle {width: u32,height: u32,
}impl Rectangle {fn area(self) - u32 {self.width * self.height}
}fn main() {let rect1 Rectangle { width: 20, height: 40 };println!(rect1s area is {}, rect1.area());
}输出结果 rect1’s area is 800 在调用结构体方法的时候不需要填写 self 这是出于对使用方便性的考虑。
结构体关联函数
这种函数它在 impl 块中却没有 self 参数。
这种函数不依赖实例但是使用它需要声明是在哪个 impl 块中的。
一直使用的 String::from 函数就是一个关联函数。
实例
#[derive(Debug)]
struct Rectangle {width: u32,height: u32,
}impl Rectangle {fn create(width: u32, height: u32) - Rectangle {Rectangle { width, height }}
}fn main() {let rect Rectangle::create(20, 40);println!({:?}, rect);
}运行结果 Rectangle { width: 20, height: 40 } 贴士结构体 impl 块可以写几次效果相当于它们内容的拼接
单元结构体
结构体可以只作为一种象征而无需任何成员
struct UnitStruct;我们称这种没有身体的结构体为单元结构体Unit Struct。