rust笔记5结构体
结构体基础
结构体的基本定义方式和使用方式:
struct User {username: String,email: String,sign_in_count: u64,active: bool,
}fn main() {// 注意这里必须制定所有的作用域,否则会报错!!let user1 = User {username: String::from("foo"),email: String::from("foo@mail.com"),sign_in_count: 100,active: true,};
}
上述的结构体是不可变的,如果想要在运行的时候改变结构体的值,需要声明为可变的结构体:
struct User {username: String,email: String,sign_in_count: u64,active: bool,
}fn main() {// 注意这里必须制定所有的作用域,否则会报错!!let mut user2 = User {username: String::from("foo"),email: String::from("foo@mail.com"),sign_in_count: 100,active: true,};user2.username = String::from("foo1");
}
如果我们想用默认值的方式制定结构,可以利用函数expression
的方式执行,代码如下:
struct User {username: String,email: String,sign_in_count: u64,active: bool,
}fn build_user(name_: String, email_: String) -> User {User {username: name_,email: email_,sign_in_count: 0,active: false,}
}fn main() {// 不可变的结构let name1 = String::from("foo1");let email1 = String::from("foo1@Eemail.com");let user1 = build_user(name1, email1);println!("user1: {}, {}, {}, {}", user1.username, user1.email, user1.sign_in_count, user1.active);// 可变的结构let name2 = String::from("foo2");let email2 = String::from("foo2@Eemail.com");let mut user2 = build_user(name2, email2);user2.email = String::from("foo22.email.com");println!("user1: {}, {}, {}, {}", user2.username, user2.email, user2.sign_in_count, user2.active);
}
如果上述函数中,传入的参数和结构提内部结构的名字一样,则可以省略对应的名称,代码实例:
struct User {name: String,email: String,age: u8,
}fn build_user(name: String, email: String) -> User {User {name, // 同名直接省略email, // 同名直接省略age: 0,}
}fn main() {let name = String::from("foo");let email = String::from("foo@mail.com");let user1 = build_user(name, email);println!("user: {} {} {}", user1.name, user1.email, user1.age);
}
如果一个结构体实例想要使用之前实例的一些值,可以使用下面的方式:
fn build_user(name: String, email: String) -> User {User {name,email,age: 0,}
}fn main() {let name = String::from("foo");let email = String::from("foo@mail.com");let user1 = build_user(name, email);println!("user1: {} {} {}", user1.name, user1.email, user1.age);let user2 = User {name: String::from("foo2"),..user1 // 注意没有其他符号};println!("user2: {} {} {}", user2.name, user2.email, user2.age);
}
结构体的作用域可以是无名的,类似于tuple
;不过,和tuple
不同,使用=
的时候,ownership会转移的,代码实例:
struct Color(i32, i32, i32);fn main() {let black = Color(0, 0, 0);let black1 = black; // black已经是空的了println!("RGB: {} {} {}", black1.0, black1.1, black1.2);
}
结构体的方法
直接给出代码实例:
struct Rect {width: u32,height: u32,
}impl Rect { // 声明这是实现Rect结构的方法fn area(&self) -> u32 { // self类比python的即可self.width * self.height}fn can_hole(&self, other: Rect) -> bool { // other是正常的参数self.width > other.width && self.height > other.height}
}fn main() {let rect1 = Rect{width: 10, height: 20};let rect2 = Rect{width:20, height: 15};println!("rect1 area = {}", rect1.area());println!("rect2 can hod rect1 ? {}", rect2.can_hole(rect1));
}
上述的impl
可以有多个块。rust中,方法统一使用.
方式。这区别于在C++中使用->
的方式。
rust笔记5结构体相关推荐
- c语言学习笔记【结构体02】结构体指针变量与结构体变量的函数参数,C语言学习笔记结构体02结构体指针变量与结构体变量的函数参数.docx...
C 语言学习笔记[结构体02]结构体指针变量与结构体变量 的函数参数 C 语言学习笔记之结构体指针变量一提指针,那可 是 C 语言的核心了,有多少学子曾拜倒在指针的脚下.单纯的说指针,其实并不难,但是 ...
- c语言如何宏定义枚举型结构体,C语言学习笔记--枚举结构体
枚举 枚举是一种用户定义的数据类型,它用关键字enum以如下语法格式来声明: enum 枚举类型名字 {名字0,名字1,...,名字n}: 枚举类型名字通常并不真的使用,要用的是大括号里面的名字,因为 ...
- C++工作笔记-对结构体中位域的补坑说明
以前关于位域的连接: https://blog.csdn.net/qq78442761/article/details/80102666 对这篇博文进行补坑说明: 如下: structbs { int ...
- C++工作笔记-对结构体的进一步认识
最近接触了层次库,里面生成的结构体,有个很奇怪的形式,如下面代码所示: #include <iostream> using namespace std;typedef struct MyS ...
- C语言学习笔记---嵌套结构体
结构体不仅可以单独使用,也可以在结构体中嵌套另一个结构体.如下面的例子: struct Date{int year;int month;int day;};struct book{char tit ...
- 结构体学习笔记6——结构体嵌套
结构体嵌套就是 在当前的结构体内的一个成员是另一个整体的结构体变量! struct Stu {char name[10];int age; }; struct Teach {char TeachNam ...
- C语言学习笔记(15)——结构体程序设计
前言 C语言的基本数据类型有整数型.实数型及字符型,使用这些基本数据类型可以构造数组类型,并且可以定义相关数据类型的指针.本节介绍的结构体类型区别于以上任何数据类型,它还能把各种不同类型的数据组合成一 ...
- C/C++ 学习笔记:结构体中最后一个成员为[0]或[1]长度数组(柔性数组成员)的用法
结构体中最后一个成员为[0]长度数组的用法:这是个广泛使用的常见技巧,常用来构成缓冲区.比起指针,用空数组有这样的优势:(1).不需要初始化,数组名直接就是所在的偏移:(2).不占任何空间,指针需要占 ...
- C++学习笔记25——结构体的定义和使用,结构体数组,结构体指针
结构体 结构体的基本概念 结构体属于用户自定义的数据类型,允许用户存储不同的数据类型 结构体的定义和使用 语法:struct 结构体名 {结构体成员列表}: 通过结构体创建变量的方式有三种: stru ...
最新文章
- java steam 排序_java8 stream自定义分组求和并排序的实现
- 函数幂计算机中怎么用,Excel中幂函数的操作使用
- Tensorflow2.0(Keras)转换TFlite
- Nova Suspend/Rescue 操作详解 - 每天5分钟玩转 OpenStack(35)
- CF788789(div1div2)
- 汇编语言(二十三)之求一个数的补数
- Mariadb使用总结
- 一款可留言的恋爱计时HTML源码
- 【BZOJ1045】【codevs1868】糖果传递,数学贪心
- Python使用递归法和函数式编程计算整数各位之和
- 2021年10种最佳数据库管理软件
- 2020暨大计算机考研失败经验总结
- 处理UNICODE下【中文乱码】异常
- system.IO.FileNotFoundException: 未能加载文件或程序集
- 城市消防远程监控系统
- 小白学习笔记之计算机要点
- 操盘手的灵魂 - 交易纪律
- Java 证书 数字签名_JAVA 给PDF添加数字签名
- Java语言基础大合集
- 电脑蓝屏解决方案:DPC WATCHDOG VIOLATION
热门文章
- 最短路径问题 图论
- 美团笔试题——公司食堂
- 【Cite 1.7K】Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour
- dpkg: error processing package oracle-java8-installer (--configure):
- 禁止logback输出状态信息
- 【自考总结】烟火里的尘埃
- jenkins没有参数化构建过程选项
- PoiDocxDemo【Android将表单数据生成Word文档的方案之二(基于Poi4.0.0),目前只能java生成】...
- 移动端照片上传、头像裁剪完整功能,兼容iphone,android (一)
- 一位父亲和一位母亲讲述孩子的成长故事--《粗养的智慧:李聃的普林斯顿之路》和《我的儿子马友友》阅读摘录...