Rust Struct结构体详解

目录
  • Defining and Instanting 定义与实例化
  • Derived Traits派生trait
  • Method 方法
  • 自动引用与解引用

Defining and Instanting 定义与实例化

使用struct关键字以定义结构体。

struct User {
	id: u64,
	name: String,
	email: String,
	active: bool,
}

使用let语句声明结构体的实例,使用mut指定可变性(必须全部可变或不可变,没有部分可变)

let user1 = User {
    id: 1u64,
    name: String::from("Zheng"),
    email: String::from("888888@outlook.com"),
    active: true,
};

使用.指定结构体成员,如user1.name

如果参数或变量与字段名同名,可以使用简化写法初始化变量

fn new_user(id: u64, name: String, email: String) -> User {
	User {
		id,
		name,
		email,
		active: true
	}
}

使用结构体更新语法,可以基于已有实例的字段创建新实例

	let user3 = User {
		id: 3u64,
		..user2
	};

使用..[instant_name]语法,剩余字段将使用user2的字段

Attention: 结构体更新等同于变量赋值,将发生value move,源变量可能导致不可用

let user3 = User {
    id: 3u64,
    ..user2
};
println!("{:#?}", user3);
println!("user2: {:p}; user3: {:p}", &user2, &user3);

以上代码将会产生错误:borrow of a partially moved value。这是由于user2的部分变量(字符串String)被赋值给了user3,导致所有权发生转移,结构体整体(不包括未发生value move的字段)将不再可用。

使用元组结构体可定义匿名字段

struct Color(i32, i32, i32);
struct Point(i32, i32, i32);

注意,不同名的相同结构元组结构体将视为不同的类型,无法相互转换

使用空结构体,只实现trait,不需要存储任何数据时可以使用。

结构体数据的所有权:当一个结构体拥有其全部数据的所有权,则只要结构体有效,其数据就有效。如果存在对其他数据的引用,则需要使用生命周期支持。

Derived Traits派生trait

派生trait,指通过derive注解 derive attribute来派生的trait,可以为自定义类型添加许多功能。关于派生trait列表,详见附录C

这里使用Debug trait展示自定义结构体的成员信息。

#[derive(Debug)]
struct User {
	id: u64,
	name: String,
	email: String,
	active: bool,
}
fn main() {
    let user1 = User {
		id: 1u64,
		name: String::from("Zheng"),
		email: String::from("888888@outlook.com"),
		active: true,
	};
    println!("{:#?}", user1);
}
  • 以上代码会显示user1的全部字段信息
  • 也可以使用{:?},单行输出
  • 实际上,它调用了std::fmt::Display,这被包含在派生trait中。

Method 方法

方法是定义在结构体(或枚举类型enumtrait对象)的上下文中的类似函数的过程,第一个参数是self,用于指代调用方法的结构体实例。

Define

需要在impl块中定义方法,

#[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: 20,
	};
	println!("Size of {:?} is {}", rect1, rect1.area());
}
  • self参数自动拥有impl的结构体类型,不需要另行指定
  • self参数同样拥有可变引用和直接获取所有权
  • 除了方法必须在impl块中,以及第一个参数名必须为self以外,其余与函数相同
  • 可以使用多个impl块来定义方法、关联函数,在泛型和trait中有应用价值

自动引用与解引用

在方法调用中,Rust支持自动引用与解引用,使调用者匹配方法的签名,如添加& &mut *等。

Associated function 关联函数

之前已经提到过,还有不需要接收实例参数的关联函数。因为其不做用于某个结构体实例,所以称其为函数。使用::来使用关联函数。

到此这篇关于Rust Struct结构体详解的文章就介绍到这了,更多相关Rust Struct内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 深入了解Rust 结构体的使用

    目录 楔子 定义并实例化结构体 简化版的实例化方式 基于已有结构体实例创建 元组结构体 没有字段的空结构体 结构体数据的所有权 使用结构体的示例程序 楔子 结构体是一种自定义的数据类型,它允许我们将多个不同的类型组合成一个整体.下面我们就来学习如何定义和使用结构体,并对比元组与结构体之间的异同.后续我们还会讨论如何定义方法和关联函数,它们可以指定那些与结构体数据相关的行为. 定义并实例化结构体 结构体与我们之前讨论过的元组有些相似,和元组一样,结构体中的数据可以拥有不同的类型.而和元组不一样的是

  • Rust结构体的定义与实例化详细讲解

    结构体和我们在“元组类型”部分论过的元组类似,它们都包含多个相关的值.和元组一样,结构体的每一部分可以是不同类型.但不同于元组,结构体需要命名各部分数据以便能清楚的表明其值的意义.由于有了这些名字,结构体比元组更灵活:不需要依赖顺序来指定或访问实例中的值. 定义结构体,需要使用 struct 关键字并为整个结构体提供一个名字.结构体的名字需要描述它所组合的数据的意义.接着,在大括号中,定义每一部分数据的名字和类型,我们称为 字段(field).结构体类似于Java中的实体. 一个存储用户账号信息

  • C语言 structural body结构体详解用法

    目录 结构体 结构体类型的声明 举个现实例子 程序实例 结构体成员的类型: 结构体变量的定义和初始化 程序一 结构体嵌套情况下,初始化和定义 结构体成员的访问 结构体传参 程序一: 程序二 结构体 结构是一些值的集合,这些值称为成员变量,结构的每个成员可以是不同类型的变量 结构体类型的声明 创建 结构体类型 没有占 内存空间,因为还 没有 创建变量 举个现实例子                 盖房子 图纸 --------------------> 房子 结构体类型        结构体变量

  • Go语言空结构体详解

    目录 前言 什么是空结构体 特点 地址相同 大小为0 原理探究 使用场景 集合(Set) channel中信号传输 总结 前言 在使用 Go 语言开发过程中,我们不免会定义结构体,但是我们定义的结构体都是有字段的,基本不会定义不包含字段的 空结构体.你可能会反过来问,没有字段的空结构体有什么用呢?那么我们这篇文章就来研究下空结构体吧! 注:本文基于go 1.14.4 分析 什么是空结构体 我们说不包含任何字段的结构体叫做空结构体,可以通过如下的方式定义空结构体: 原生定义 var a struc

  • Go实现简单的数据库表转结构体详解

    目录 前言 设计过程 迭代升级 前言 码上源码 package main import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" "strings" ) /** 自动将表生成 model结构, 通过创建数据库连接,读取数据库的所有表并对所有的表元数据封装转化实体结构体 */ type SchemaMeta struct { Field string Ty

  • C#枚举类型和结构体详解

    注意:枚举类型和结构体都属于值类型. 结构体:就是一个自定义的集合,里面可以放各种类型的元素,用法大体跟集合一样. 一.定义的方法: struct student { public int nianling; public int fenshu; public string name; public string sex; public int sum; } 以上的语句就是定义一个名称为student的结构体,其中包含int类型的年龄.分数.总和,和string类型的姓名.性别. 二.用法: 在

  • C++结构体详解

    目录 一.结构体的定义 二.创建具体的变量(3种) 三.结构体数组 四.结构体指针 五.结构体嵌套结构体 六.结构体做函数参数 1.值传递 2.地址传递 七.结构体中const使用场景 总结 一.结构体的定义 struct Student { string name; int age; int score; }; 二.创建具体的变量(3种) struct Student s1; s1.name = "张三"; s1.age = 18; s1.score = 90; struct Stu

  • 详解C++程序中定义struct结构体的方法

    什么是结构体? 简单的来说,结构体就是一个可以包含不同数据类型的一个结构,它是一种可以自己定义的数据类型,它的特点和数组主要有两点不同,首先结构体可以在一个结构中声明不同的数据类型,第二相同结构的结构体变量是可以相互赋值的,而数组是做不到的,因为数组是单一数据类型的数据集合,它本身不是数据类型(而结构体是),数组名称是常量指针,所以不可以做为左值进行运算,所以数组之间就不能通过数组名称相互复制了,即使数据类型和数组大小完全相同. 结构体的定义 定义结构体使用struct修饰符,例如: struc

  • C语言线性表顺序存储结构实例详解

    C语言线性表顺序存储结构实例详解 1. 什么是顺序存储结构? 用一段地址连续的存储单元依次存储线性表的数据元素. 2.线性表的顺序存储结构 #include<stdio.h> #include<stdlib.h> #define Max 80 //存储空间初始分配量 #define Increment 10 //存储空间分配增量 typedef struct { int *elem; // 存储空间基地址,此处为int型,视情况而定 int length; // 元素表当前长度 i

  • PHP读书笔记整理_结构语句详解

    PHP结构语句顺序结构 顺序结构就像一条直线,按着顺序一直往下执行.我们编写的代码默认都是按照顺序结构执行的. 条件结构之if-else- 条件结构就像一个岔路口,可以向左走,也可以向右走.比如上洗手间,我们知道我们的性 别,这时候我们需要根据洗手间提供的条件,左边男洗手间,右边女洗手间,或者正好相反,其中性别就是这个条件结构的条件.再比如,现在的分数都流行使用 A.B.C来分级,假设考试成绩是93分,可以将其设置为等级A,考试成绩是87,可以将其设置为等级B,这里分数区间即为条件结构中的条件.

  • Java导出oracle表结构实例详解

     Java导出oracle表结构实例详解 最近用到的,因为plsql是收费的,不让用,找了很多方法终于发现了这个. 核心语句 SELECT DBMS_METADATA.GET_DDL(U.OBJECT_TYPE, U.object_name), U.OBJECT_TYPE FROM USER_OBJECTS U where U.OBJECT_TYPE = 'TABLE' or U.OBJECT_TYPE = 'VIEW' or U.OBJECT_TYPE = 'INDEX' or U.OBJEC

  • JVM入门之JVM内存结构内容详解

    一.java代码编译执行过程 源码编译:通过Java源码编译器将Java代码编译成JVM字节码(.class文件) 类加载:通过ClassLoader及其子类来完成JVM的类加载 类执行:字节码被装入内存,进入JVM虚拟机,被解释器解释执行   注:Java平台由Java虚拟机和Java应用程序接口搭建,Java语言则是进入这个平台的通道,   用Java语言编写并编译的程序可以运行在这个平台上 二.JVM简介 1.java程序经过一次编译之后,将java代码编译为字节码也就是class文件,然

随机推荐