结构体基础

结构体的基本定义方式和使用方式:

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结构体相关推荐

  1. c语言学习笔记【结构体02】结构体指针变量与结构体变量的函数参数,C语言学习笔记结构体02结构体指针变量与结构体变量的函数参数.docx...

    C 语言学习笔记[结构体02]结构体指针变量与结构体变量 的函数参数 C 语言学习笔记之结构体指针变量一提指针,那可 是 C 语言的核心了,有多少学子曾拜倒在指针的脚下.单纯的说指针,其实并不难,但是 ...

  2. c语言如何宏定义枚举型结构体,C语言学习笔记--枚举结构体

    枚举 枚举是一种用户定义的数据类型,它用关键字enum以如下语法格式来声明: enum 枚举类型名字 {名字0,名字1,...,名字n}: 枚举类型名字通常并不真的使用,要用的是大括号里面的名字,因为 ...

  3. C++工作笔记-对结构体中位域的补坑说明

    以前关于位域的连接: https://blog.csdn.net/qq78442761/article/details/80102666 对这篇博文进行补坑说明: 如下: structbs { int ...

  4. C++工作笔记-对结构体的进一步认识

    最近接触了层次库,里面生成的结构体,有个很奇怪的形式,如下面代码所示: #include <iostream> using namespace std;typedef struct MyS ...

  5. C语言学习笔记---嵌套结构体

      结构体不仅可以单独使用,也可以在结构体中嵌套另一个结构体.如下面的例子: struct Date{int year;int month;int day;};struct book{char tit ...

  6. 结构体学习笔记6——结构体嵌套

    结构体嵌套就是 在当前的结构体内的一个成员是另一个整体的结构体变量! struct Stu {char name[10];int age; }; struct Teach {char TeachNam ...

  7. C语言学习笔记(15)——结构体程序设计

    前言 C语言的基本数据类型有整数型.实数型及字符型,使用这些基本数据类型可以构造数组类型,并且可以定义相关数据类型的指针.本节介绍的结构体类型区别于以上任何数据类型,它还能把各种不同类型的数据组合成一 ...

  8. C/C++ 学习笔记:结构体中最后一个成员为[0]或[1]长度数组(柔性数组成员)的用法

    结构体中最后一个成员为[0]长度数组的用法:这是个广泛使用的常见技巧,常用来构成缓冲区.比起指针,用空数组有这样的优势:(1).不需要初始化,数组名直接就是所在的偏移:(2).不占任何空间,指针需要占 ...

  9. C++学习笔记25——结构体的定义和使用,结构体数组,结构体指针

    结构体 结构体的基本概念 结构体属于用户自定义的数据类型,允许用户存储不同的数据类型 结构体的定义和使用 语法:struct 结构体名 {结构体成员列表}: 通过结构体创建变量的方式有三种: stru ...

最新文章

  1. java steam 排序_java8 stream自定义分组求和并排序的实现
  2. 函数幂计算机中怎么用,Excel中幂函数的操作使用
  3. Tensorflow2.0(Keras)转换TFlite
  4. Nova Suspend/Rescue 操作详解 - 每天5分钟玩转 OpenStack(35)
  5. CF788789(div1div2)
  6. 汇编语言(二十三)之求一个数的补数
  7. Mariadb使用总结
  8. 一款可留言的恋爱计时HTML源码
  9. 【BZOJ1045】【codevs1868】糖果传递,数学贪心
  10. Python使用递归法和函数式编程计算整数各位之和
  11. 2021年10种最佳数据库管理软件
  12. 2020暨大计算机考研失败经验总结
  13. 处理UNICODE下【中文乱码】异常
  14. system.IO.FileNotFoundException: 未能加载文件或程序集
  15. 城市消防远程监控系统
  16. 小白学习笔记之计算机要点
  17. 操盘手的灵魂 - 交易纪律
  18. Java 证书 数字签名_JAVA 给PDF添加数字签名
  19. Java语言基础大合集
  20. 电脑蓝屏解决方案:DPC WATCHDOG VIOLATION

热门文章

  1. 最短路径问题 图论
  2. 美团笔试题——公司食堂
  3. 【Cite 1.7K】Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour
  4. dpkg: error processing package oracle-java8-installer (--configure):
  5. 禁止logback输出状态信息
  6. 【自考总结】烟火里的尘埃
  7. jenkins没有参数化构建过程选项
  8. PoiDocxDemo【Android将表单数据生成Word文档的方案之二(基于Poi4.0.0),目前只能java生成】...
  9. 移动端照片上传、头像裁剪完整功能,兼容iphone,android (一)
  10. 一位父亲和一位母亲讲述孩子的成长故事--《粗养的智慧:李聃的普林斯顿之路》和《我的儿子马友友》阅读摘录...