Rust Struct 属性初始化

结构体是用户定义的数据类型,其中包含定义特定实例的字段。结构有助于实现更容易理解的抽象概念。本文介绍几种初始化结构体对象的方法,包括常规方法、Default特征、第三方包实现以及构建器模式。
在这里插入图片描述

Struct声明与初始化

struct Employee {id: i32,name: String,address: String,designation: String,
}

每个字段的类型都写在它的名称前面(例如,id的类型是i32,名称是String,地址也是String,等等)。在声明结构体时,应给每个属性值赋,这个过程称为初始化。

struct Student {name:String,gpa:i32,faculty:String,
}fn main() {let std1 = Student {faculty:String::from("Computer Science"),name:String::from("Nil"),gpa:3};println!("Name is :{}, Faculty is :{}, GPA is :{}",std1.name,std1.faculty,std1.gpa);
}// 输出结果:Name is :Nil, Faculty is :Computer Science, GPA is :3

我们创建了一个名为Student的结构体,其中包含三个属性name、gpa和faculty。数据类型分别为String、i32和String。该结构在main()中初始化,然后利用println!宏打印结构的属性值。

实现Default 特征

实现Default trait可以为结构体提供默认值。我们可以通过对数据结构进行适度调整来使用自动生成的默认实现。当在数据结构中使用#[derived (Default)]时,编译器给每个属性中设置默认值。默认的布尔值为false,而默认的整数值为0。

#[derive(Default)]
struct Student {name:String,gpa:i32,faculty:String,
}fn main() {let std1 = Student {faculty: String::from("Computer Science"),name:String::from("Nil"),..Default::default()};println!("Name is :{}, Faculty is :{}, GPA is :{}",std1.name,std1.faculty,std1.gpa);
}// 输出结果:Name is :Nil, Faculty is :Computer Science, GPA is :0

gpa自动被设置了默认值,它的默认值是0。

使用 derivative 包

derivative包提供了一组可以自定义的#[derive]属性。它可以帮助用户在结构体(struct)上自动实现一些复杂的行为。在初始化结构体属性方面,它可以结合属性宏(attribute macros)来提供灵活的初始化方式。需要使用cargo add derivative 引入依赖

use derivative::Derivative;use derivative::Derivative;
#[derive(Derivative, Debug)]
#[derivative(Default)]
struct Person {name: String,age: u32,
}#[derive(Derivative, Debug)]
#[derivative(Default)]
struct Student {#[derivative(Default(value = "-1"))]gpa:i32,
}fn main() {let person: Person = Person{..Default::default()};// println!("Student: {:?}", Person);// 此时person.name是一个空字符串,person.age是0println!("Student: {:?}", Student::default());
}
// 输出结果: Student: Student { gpa: -1 }

我们将gpa的默认值设置为-1, 初始化时不在需要给gpa传递任何值。

构建器模式

虽然derivative本身没有直接提供构建器模式,但可以与构建器模式结合使用。构建器模式可以让用户更灵活地初始化结构体的属性,特别是当结构体有很多可选参数或者复杂的初始化逻辑时。

首先,定义一个PersonBuilder结构体作为构建器:

use derivative::Derivative;
#[derive(Derivative)]
#[derivative(Default)]
struct Person {name: String,age: u32,
}
struct PersonBuilder {name: Option<String>,age: Option<u32>,
}
impl PersonBuilder {fn new() -> Self {PersonBuilder {name: None,age: None,}}fn name(mut self, name: String) -> Self {self.name = Some(name);self}fn age(mut self, age: u32) -> Self {self.age = Some(age);self}fn build(self) -> Person {Person {name: self.name.unwrap_or(String::from("Unknown")),age: self.age.unwrap_or(0),}}
}

下面是使用构建器方式初始化:

let person = PersonBuilder::new().name(String::from("Alice")).age(30).build();

更新方法

通过函数式更新初始化(在derivative支持的派生 trait 基础上实现)。

假设我们已经有一个Person结构体实例,并且想要创建一个新的实例,只修改其中的某些属性。首先,给Person结构体实现一个update方法(这可以通过derivative来帮助派生一些辅助 trait,使得实现这个方法更方便):

use derivative::Derivative;
#[derive(Derivative)]
#[derivative(Default)]
struct Person {name: String,age: u32,
}
impl Person {fn update(mut self, name: Option<String>, age: Option<u32>) -> Self {if let Some(new_name) = name {self.name = new_name;}if let Some(new_age) = age {self.age = new_age;}self}
}

初始化测试代码:

let original_person = Person {name: String::from("Bob"),age: 25,
};
let new_person = original_person.update(Some(String::from("Charlie")), Some(35));

如果不希望更新age属性,直接传入None:

let emp = original_person.update(Some(String::from("Charlie")), None);
println!("emp:{:?}", emp);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/14632.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Vue全栈开发旅游网项目(10)-用户管理后端接口开发

1.异步用户登录\登出接口开发 1.设计公共响应数据类型 文件地址&#xff1a;utils/response404.py from django.http import JsonResponseclass BadRequestJsonResponse(JsonResponse):status_code 400def __init__(self, err_list, *args, **kwargs):data {"error_c…

数据结构:队列

目录 概念与结构底层结构的选择队列的实现队列头文件&#xff08;queue.h&#xff09;队列初始化队列的销毁入队列检查队列是否为空出队列查询队列第一个数据查询队列末尾数据查询队列有效数据个数代码试运行 概念与结构 概念&#xff1a;只允许在⼀端进行插⼊数据操作&#x…

Clickhouse集群新建用户、授权以及remote权限问题

新建用户 create user if not exists user on cluster 集群名称 IDENTIFIED WITH plaintext_password BY 密码;给用户授查询、建表、删表的权限 GRANT create table,select,drop table ON 数据库实例.* TO user on cluster 集群名称 ;再其他节点下用户建本地表成功&#…

JavaWeb--MySQL

1. MySQL概述 首先来了解一下什么是数据库。 数据库&#xff1a;英文为 DataBase&#xff0c;简称DB&#xff0c;它是存储和管理数据的仓库。 像我们日常访问的电商网站京东&#xff0c;企业内部的管理系统OA、ERP、CRM这类的系统&#xff0c;以及大家每天都会刷的头条、抖音…

i春秋-SQLi(无逗号sql注入,-- -注释)

练习平台地址 竞赛中心 题目描述 后台有获取flag的线索应该是让我们检查源码找到后台 题目内容 空白一片 F12检查源码 发现login.php 访问login.php?id1 F12没有提示尝试sql注入 常规sql注入 //联合注入得到表格列数 1 order by 3 # 1 union select 1,2,3 #&#xff08…

基于Spring Boot的电子商务平台架构

2 相关技术 2.1 SpringBoot框架介绍 Spring Boot是一种不需要代码生成的一种框架&#xff0c;并且可以不需要配置任何的XML文件就可以&#xff0c;因为Spring Boot里面自带了很多接口&#xff0c;只需要配置不同的接口就会自动的应用并且识别需要的依赖&#xff0c;在配置方面非…

华为云分布式缓存服务(DCS)专家深度解析Valkey,助力openEuler峰会

在数字化时代&#xff0c;开源技术已成为推动创新和协作的重要力量。 11月15日&#xff0c;openEuler峰会将于北京中关村国际创新中心举行。本次峰会&#xff0c;华为云分布式缓存服务&#xff08;DCS&#xff09;的两位专家将为大家深入讲解Valkey的核心特性与优势。 更多大…

如何进行产线高阶能耗数据的计算和可视化?

一、前言 在当前经济下行时期&#xff0c;越来越来多企业开始对产线进行数字化转型&#xff0c;提高企业竞争力。在产线数字化转型过程中&#xff0c;产线高阶能耗数据的计算和可视化是比较重要的一环&#xff0c;今天小编就和大家分享如何对产线能耗数据进行计算和可视化。 …

vsftp 修改端口 限制用户登录 开启防火墙 pasv模式

安装设置开机启动 yum -y install vsftpd systemctl start vsftpd systemctl enable vsftpd 修改配置&#xff0c;追加端口号到最后一行 vim /etc/vsftpd/vsftpd.conf listen_port5510 编辑 /etc/services 文件&#xff0c;将其中的三行端口改成5510 vim /etc/services ftp …

IntelliJ IDEA插件开发-代码补全插件入门开发

使用IntelliJ IDEA想必大家都有使用过代码自动补全功能&#xff0c;如输入ab&#xff0c;会自动触发补全&#xff0c;提供相应的补全建议列表。作为有追求的程序员&#xff0c;有没有想过这样的功能是如何实现的&#xff1f;本节将详细介绍如何实现一个类似的代码自动补全插件。…

❤React-React 组件基础(类组件)

❤React-React 组件基础 1、组件化开发介绍 组件化开发思想&#xff1a;分而治之 React的组件按照不同的方式可以分成类组件&#xff1a; 划分方式一&#xff08;按照组件的定义方式&#xff09; 函数组件(Functional Component )和类组件(Class Component)&#xff1b; …

Python →爬虫实践

爬取研究中心的书目 现在&#xff0c;想要把如下网站中的书目信息爬取出来。 案例一 耶鲁 Publications | Yale Law School 分析网页&#xff0c;如下图所示&#xff0c;需要爬取的页面&#xff0c;标签信息是“<p>”&#xff0c;所以用 itemssoup.find_all("p&…

机器学习: LightGBM模型(优化版)——高效且强大的树形模型

LightGBM&#xff08;Light Gradient Boosting Machine&#xff09;是一种基于梯度提升决策树&#xff08;GBDT&#xff09;的框架&#xff0c;由微软提出。它具有高效的训练速度、低内存占用、支持并行和GPU加速等特点&#xff0c;非常适合大规模数据的训练任务&#xff0c;尤…

《内存函数》

内存函数 1. memcpy函数 &#xff08;1&#xff09;介绍 这里通过memcpy的定义我们可以看这个函数包含三个参数&#xff0c;destination就是拷贝的目的地&#xff0c;source就是拷贝的源头&#xff0c;num就是拷贝的个数。 &#xff08;2&#xff09;使用 这里要包含头文件s…

不泄密的安全远程控制软件需要哪些技术

在数字化浪潮中&#xff0c;远程控制软件已不再是简单的辅助工具&#xff0c;而是成为企业运作和日常工作中不可或缺的一部分。随着远程办公模式的广泛采纳&#xff0c;这些软件提供了一种既安全又高效的途径来管理和访问远端系统。无论是在家办公、技术支持还是远程教育&#…

Pycharm打开终端时报错:Cannot open Local,Failed to start[powershell.exe]

问题如下&#xff1a; 解决办法&#xff1a; 修改设置中的shell path路径 英文版pycharm&#xff1a;file -> settings -> Tools -> Terminal -> Shell path 中文版pycharm&#xff1a;文件 -> 设置 -> 工具 -> 终端 -> Shell路径 将Shell路径不全 …

15分钟学 Go 第 51 天 :通用库与工具使用

第51天&#xff1a;通用库与工具使用 一、学习目标 类别工具/库用途命令行工具cobra构建命令行应用JSON处理gjson高效JSON解析HTTP客户端restyHTTP请求处理日期处理carbon时间日期操作配置管理viper配置文件处理 二、详细实现 让我们通过具体示例来学习这些库的使用&#x…

基于微信小程序的乡村研学游平台设计与实现,LW+源码+讲解

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自…

VLC-QT----Linux编译并运行示例

linux:ubuntu 16.04 qt:5.13.2 总体安装步骤 下载安装,编译 下载源码仓库,下载cmake,新建一个build文件夹,cd进去,执行代码 cmake .. -DCMAKE_BUILD_TYPEDebug 遇到报错,没有qt5Coreconfig,运行 sudo apt-get install qtdeclarative5-dev进行安装 遇到报错 Could not fi…

机器学习:XGBoost模型——高效且强大的树形模型

XGBoost&#xff08;Extreme Gradient Boosting&#xff0c;极端梯度提升树&#xff09;是一种强大的梯度提升算法&#xff0c;在现实中被广泛用于分类和回归任务。它通过集成多个简单的基学习器&#xff08;通常是决策树&#xff09;来构建一个强大的预测模型。 基本原理步骤…