什么是结构体

数组用于表示值的同构集合。类似地,结构体是Rust中另一个用户定义的数据类型,它允许我们组合不同类型的数据项,包括另一个结构体。结构体将数据定义为键值对.

定义一个结构体

struct 关键字用于声明结构体。由于结构体是静态类型的,因此结构体中的每个字段都必须与数据类型相关联。结构的命名规则和约定类似于变量。结构块必须以分号结尾.

语法如下:

struct Name_of_structure {   field1:data_type,   field2:data_type,   field3:data_type}

初始化一个结构体

举例:

struct Employee {    name: String,    company: String,    age: u32,}fn demo53() {      let emp1 = Employee {        company: String::from("今日头条"),        name: String::from("张三"),        age: 50,    };          // 注意花括号内指定.    println!("Name is :{} company is {} age is {}", emp1.name, emp1.company, emp1.age);   // 使用 "." 来访问指定字段的值.}fn main() {        demo53();}

上面的实例定义了一个Employee 的结构体, 包含3个成员字段(变量), name, company, age.

demo53 初始化这个结构体,并打印成员的name,company, age, 使用 "." 来访问指定字段的值.

修改结构体实例

要修改实例,结构体成员变量应标记为可变。

下面的示例声明并初始化名为Employee的结构,然后将age字段的值从50修改为40

let mut emp1 = Employee {   company:String::from("今日头条"),   name:String::from("张三"),   age:50};emp1.age = 40;println!("Name is :{} company is {} age is {}",emp1.name,emp1.company,emp1.age);

输出结果:

Name is :今日头条 company is TutorialsPoint age is 40

传递结构体到函数

把结构体作为参数传递给函数.

fn display5(emp: Employee) {    println!("Name is :{} company is {} age is {}", emp.name, emp.company, emp.age);}fn demo54() {    let emp1 = Employee {        company: String::from("腾讯"),        name: String::from("李四"),        age: 50,    };    let emp2 = Employee {        company: String::from("今日头条"),        name: String::from("王二"),        age: 32,    };    display5(emp1);    display5(emp2);}

cargo run:

Name is :李四 company is 腾讯 age is 50Name is :王二 company is 今日头条 age is 32

函数返回结构体

接上面的例子,假如我们有一个比较年龄的函数,返回年龄最大的.

fn who_is_elder(emp1: Employee, emp2: Employee) -> Employee {    if emp1.age > emp2.age {        return emp1;    } else {        return emp2;    }}fn demo55() {    let emp1 = Employee {        company: String::from("腾讯"),        name: String::from("李四"),        age: 50,    };    let emp2 = Employee {        company: String::from("今日头条"),        name: String::from("王二"),        age: 32,    };    let elder = who_is_elder(emp1, emp2);    println!("年纪大的是 :");    display5(elder);}fn main() {    demo55();}

cargo run:

年纪大的是 :Name is :李四 company is 腾讯 age is 50

结构体方法

结构体方法就像函数。它们是一组逻辑的组合。方法用fn关键字声明。方法的作用域在结构块内。

结构体方法在结构块外部声明。

impl关键字用于在结构体的上下文中定义方法。

方法的第一个参数总是self,它表示结构的调用实例。

方法对结构的数据成员进行操作。

要调用一个方法,我们需要首先实例化该结构。

可以使用结构体的实例调用该方法。

语法:

struct My_struct {}impl My_struct {    //方法上下文.   fn method_name() {       //定义一个方法   }}

举个栗子:

下面的示例定义了一个具有字段: width和height的结构体 Rectangle "矩形"。方法区域是在结构ti体的上下文中定义的。area方法通过self关键字访问结构的字段并计算矩形的面积。

struct Rectangle {    width: u32,    height: u32,}//计算矩形面积.impl Rectangle {    fn area(&self) -> u32 {        //使用 "." 访问成员变量.        self.width * self.height    }}fn demo56() {    let small = Rectangle {        width: 10,        height: 20,    };    println!("width is {} height is {} area of Rectangle  is {}",              small.width, small.height, small.area());}fn main() {    demo56();}

cargo run:

   Finished dev [unoptimized + debuginfo] target(s) in 0.50s     Running `targetdebughello-world.exe`width is 10 height is 20 area of Rectangle  is 200

静态方法:

静态方法方法在结构被实例化之前就已经存在了。

静态方法是使用结构的名称调用的,并且可以在没有实例的情况下进行访问。与普通方法不同,静态方法不接受&self参数。

定义一个静态方法

静态方法(如函数和其他方法)可以选择性的包含参数.

语法:

impl Structure_Name {   // 静态方法创建结构体    fn method_name(param1: datatype, param2: datatype) -> return_type {      // 逻辑代码.   }}

调用静态方法

语法:

structure_name::method_name(v1,v2)

举个例子:

struct Point {    x: i32,    y: i32,}impl Point {    // 静态方法创建  Point 结构体.    fn getInstance(x: i32, y: i32) -> Point {        Point { x: x, y: y }    }    //显示结构体成员变量值.    fn display(&self) {        println!("x ={} y={}", self.x, self.y);    }}fn demo57() {    let p1 = Point::getInstance(10, 20);    p1.display();}fn main() {    demo57();}

这跟其他语言的静态方法是相似的.

cargo run:

输出结果.

x =10 y=20

如何在结构体里面套结构体_Rust 学习笔记-13 Rust 结构体相关推荐

  1. 5G NR学习笔记:帧结构和物理资源

    5G NR学习笔记:帧结构和物理资源 参数集(numerology) 与LTE的参数集(子载波间隔和符号长度)不同,NR支持不同的子载波间隔(Sub-Carrier Spacing, SCS),所有的 ...

  2. # 遍历结构体_C#学习笔记05--枚举/结构体

    一.枚举 当变量的取值范围是固定的几个, 例如性别--男,女; 英雄类型 -- 法师, 刺客.战士, 射手等等. 这时就可以使用枚举类型, 会更加简洁方便. 1.1.定义: 访问修饰符 enum 枚举 ...

  3. C#学习笔记_12_枚举结构体

    12_枚举&结构体 枚举 是一种数据类型 适用于某些取值范围有限的数据 语法: [访问权限修饰符] enum 枚举名 { 枚举值 } 枚举名遵循大驼峰命名法 枚举一般情况下是和switch c ...

  4. Swift学习笔记 (十八) 结构体和类

    结构体和类作为一种通用而又灵活的结构,成为了人们构建​代码的​基础.你可以使用定义常量.变量和函数的语法,为你的结构 体和类定义属性.添加方法. 与其他编程语⾔所不同的是,Swift 并不要求你为自定 ...

  5. 学习笔记17-C语言-结构、联合、枚举

    结构: struct 结构是由程序猿自己设计的一种数据类型,用于描述一个事务的各项数据,由若干个不同的基础数据类型组成.设计结构:struct 结构体名{类型 成员名:...}:定义结构体变量stru ...

  6. Solr6.7 学习笔记(01) -- 目录结构

    Solr解压后的目录结构 --contrib: Solr的一些扩展 --analysis-extras: 包含一些文本分析组件及其依赖 --clustering: 包含一个用于集群搜索结果的引擎 -- ...

  7. Lawliet|C语言学习笔记5——循环结构

    C语言学习笔记--循环结构 1.求1+2+3+-+100 #include<stdio.h> int main() {int i=1,sum=0; //定义变量i的初值为1,sum的初值为 ...

  8. Lawliet|C语言学习笔记3——顺序结构

    C语言学习笔记--顺序结构 计算a+b #include<stdio.h> int main() {int a,b,sum;scanf("%d%d",&a,&a ...

  9. Lawliet|C语言学习笔记4——选择结构

    C语言学习笔记--选择结构 求一元二次方程的根 简约版 #include<stdio.h> #include<math.h> //程序中要调用求平方根函数sqrt int ma ...

最新文章

  1. 力扣(LeetCode)刷题,简单题(第8期)
  2. 中山网络推广解答网站排名优化为什么总是上不了首页!
  3. 《Cisco QoS认证考试指南(第2版)》一导读
  4. 米的换算单位和公式_求小学数学的公式、换算和单位转英文字母(米cm)
  5. python中none算变量吗_在python中对变量判断是否为None的三种方法总结
  6. 2.3.14 Python 函数进阶-生成器
  7. 宝马自然语音识别体验,语音识别率和速度都有了显著提升
  8. Android系统是目前最为流行的手机系统之一
  9. 在ASP.NET中加密页面机制
  10. 027_《Delphi Direct X 图形与游戏程序设计》
  11. 搭建私有云盘 cloudreve
  12. 国内外各大免费搜索引擎、导航网址提交入口
  13. 数据结构之队列(链式队列)的基本操作与实现
  14. 【Web开发】Python实现Web图表功能(D-Tale入门)
  15. overflow:auto
  16. 大家都在用哪些OKR管理工具?
  17. Spring BlazeDS Integration 的工作原理
  18. mac 时间机器 禁用_如何在Mac上禁用屏幕时间通知
  19. java quartz下载_下载、设置和运行Quartz(GUI)图形界面程序----Quartz Web
  20. Linux是 UEFI 还是L启动模式,怎么看系统是UEFI还是Legacy BIOS启动模式

热门文章

  1. JavaScript or JQuery 获取服务器时间
  2. 【清北前紧急补课8】A % B Problem
  3. md5sum/opensll md5
  4. centos 下安装mysql
  5. Hyper-V虚拟机Redhat添加网卡找不到网卡配置文件解决方法
  6. Nuxt项目支持import写法的最新解决方案
  7. weblogic服务器上类或者方法找不到的解决办法
  8. Intellij IDEA Cannot resolve symbol XXX 问题解决办法汇总
  9. 2020年6月“省时查报告”十大热门报告盘点(附下载链接)
  10. 往届选手心得分享:腾讯广告算法大赛萌新指南