Rust常用特型之Default特型

在Rust标准库中,存在很多常用的工具类特型,它们能帮助我们写出更具有Rust风格的代码。

某些类型可以有一个有意义的默认值,例如默认的向量或者字符串是空的,默认的数字为0,默认的Option是None等。

这样的类型可以实现std::default::Default特型:

trait Default {
fn default() -> Self;
}

该特型很简单,就只有一个关联函数default,用于返回自身类型的一个新的值。

我们来看字符串String对该特型的实现,非常简单:

impl Default for String {
fn default() -> String {
  String::new()
  }
}

所以字符串的默认值就是一个新的空字符串.所有Rust的集合类型,Vec,HashMap,BinaryHeap等,都实现了Default特型,它们的default函数返回一个空的集合。这在你需要先建立一个集合,以后再向里面插入值时非常有用,因为你建立集合时不需要指定其中元素的类型,在第一次插入值时决定。

例如 Iterator特型的partition函数 把迭代器产生的值分离成两个集合,它使用一个闭包函数来决定哪个值去哪个集合。

use std::collections::HashSet;
let squares = [4, 9, 16, 25, 36, 49, 64];
let (powers_of_two, impure): (HashSet<i32>, HashSet<i32>)
  = squares.iter().partition(|&n| n & (n-1) == 0);
assert_eq!(powers_of_two.len(), 3);
assert_eq!(impure.len(), 4);

闭包函数使用位操作符来查找哪些数是2的幂,partition函数使用它产生两个HashSet。当然,partition函数并不是只能产生HashSet,你可以使用它产生任何类型的集合,只要该集合实现了DefaultExtend<T>特型,前者它会产生一个新的空集合,后者是将产生的值添加到集合中去。String 也实现了DefaultExtend<char>特型,因此你可以这样写:

let (upper, lower): (String, String)
  = "Great Teacher Onizuka".chars().partition(|&c|c.is_uppercase());
assert_eq!(upper, "GTO");
assert_eq!(lower, "reat eacher nizuka");

Default特型另一个常见的应用场景为多字段结构体赋值。如果一个结构体有很多字段,但是其中绝大多数字段的值是固定的,很少变化的。因此我们构造结构体时只需要给出少数几个需要设定的字段就行了,其它的固定字段使用一个默认值就行。例如glimu::DrawParameters结构体有24个字段,每个字段都用来控制OpenGL怎么渲染图形中的某些位。而glium draw函数使用一个DrawParameters 结构体作为参数,由于它实现了Default,你可以这样写:

let params = glium::DrawParameters {
    line_width: Some(0.02),
    point_size: Some(0.02),
    .. Default::default()
};
target.draw(..., &params).unwrap();

这里我们只需要写出该结构体的两个字段 line_width和point_size,其它的都使用默认值。Default::default()会创建一个包含默认初始化值的DrawParameters结构体(这里为什么创建的值的类型是DrawParameters?因为Rust会自动推断,当然你也可以写 DrawParameters::default(),这样会多拼几个字母)。..语法是解构,和Javascript类似,就是余下的字段全部从这里获取,但是有一眯注意,它必须出现在结构体构造的最后一行(Javascript没有这个限制)。

如果一个T类型实现了Default,Rust 标准库也为Rc<T>,Arc<T>Box<T>, Cell<T>, RefCell<T>, Cow<T>, Mutex<T>

RwLock<T>自动实现了Default特型。例如,Rc<T>的默认值就是一个指向T默认值的Rc指针。如果元组的所有元素实现了Default,那么该元组(tuple)也自动实现了Default特型。它的默认值就是一个容纳了每个元素默认值的元组。

Rust 并没有为结构体自动实现Default特型。但是如果结构体所有的字段都实现了Default,那么你可以简单的在结构体定义上面添加#derive(Default)]来为该结构体自动实现Default特型。如果该结构体不符合这个条件,那么即使你手动添加了派生宏,也不会有效果。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Llama3本地部署的解决方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

Vitis HLS 学习笔记--优化指令-BIND_OP_STORAGE

目录 1. BIND_OP_STORAGE 概述 1.1 BIND_OP 1.2 BIND_STORAGE 2. 语法解析 2.1 BIND_OP 2.2 BIND_OP 用法示例 2.3 BIND_STORAGE 2.4 BIND_STORAGE 示例 3. 实例演示 4. 总结 1. BIND_OP_STORAGE 概述 BIND_OP_STORAGE 其实是两个优化指令的合称&#xff1a;BIND_OP…

SAM5808B 法国追梦DREAM 音频DSP芯

法国追梦/DERAM SAM5504/5704/5716/5808音频DSP芯片,开发板&#xff0c;方案 可用于电子鼓、电子琴、电吉他、效果器、均衡器、啸叫抑制器等电声产品领域 一、全系列芯片&#xff1a; SAM2634 SAM2695 SAM5504B SAM5704B SAM5708B SAM5808B SAM5716B SAM5916B... 二…

python基础知识一(注释、变量以及类型、类型转换)

目录 注释&#xff1a; 注释分为两种&#xff1a; 注释的作用&#xff1a; 注释的使用原则&#xff1a; 编写一段代码&#xff0c;对比一下有无注释的区别&#xff0c;以冒泡排序为例 1. 无注释版&#xff1a; 感官上是不是有点不清晰&#xff1f; 2. 有注释版&#xff1…

介绍TCP三次握手、传输数据、四次挥手标志为确认号变化规律

TCP协议的三次握手是一个关键过程&#xff0c;用于在客户端和服务器之间建立可靠的连接。以下是三次握手的详细过程&#xff0c;包括标志位、序列号以及ACK的变化规律&#xff1a; 第一次握手&#xff1a; 客户端&#xff1a; 标志位&#xff1a;SYN1&#xff08;表示请求建立…

什么是定点数?

在实际的工程应用中&#xff0c;往往会进行大量的数学运算。运算时除了会用到整数&#xff0c;很多时候也会用到小数。而我们知道在数字电路底层&#xff0c;只有「高电平1」和「低电平0」的存在&#xff0c;那么仅凭 0和1 该如何表示小数呢&#xff1f; 数字电路中&#xff0…

共享股东模式:实体门店的创新商业模式

大家好&#xff0c;我是微三云周丽&#xff0c;今天给大家分析当下市场比较火爆的商业模式&#xff01; 小编今天跟大伙们分享什么是共享股东模式&#xff1f; 在传统的商业模式中&#xff0c;实体门店通常由单一的老板或少数股东掌控&#xff0c;并且经营模式相对封闭。然而&…

grafana报错This panel requires Angular (deprecated)

1.原因 报错解释&#xff1a; Grafana在更新到7.0版本后&#xff0c;弃用了AngularJS&#xff08;一种用于构建大型Web应用的JavaScript框架&#xff09;。在早期的Grafana版本中&#xff0c;某些面板可能依赖于AngularJS&#xff0c;但这种依赖已经逐步被新的React或Vue面板所…

基于SSM+Vue的护工预约服务小程序和后台管理系统

1、系统演示视频&#xff08;演示视频&#xff09; 2、需要请联系

每日一题 — 二分查找

704. 二分查找 - 力扣&#xff08;LeetCode&#xff09; 朴素二分查找模板&#xff1a; while(.......){//防止溢出int mid left(right - left)/2;if(........){right mid-1;}else if(......){left mid1;}else{return mid;}} 代码&#xff1a; public int search(int[] num…

【Python进阶实战】Flask接口并发实战

【Python进阶实战】Flask接口并发实现 前言Flask阻塞接口接口实现接口阻塞 Flask并发接口接口实现接口并发 服务部署Windows部署Linux部署gunicorn安装gunicorn运行 结语 前言 Python版本&#xff1a;3.12.3 IDE&#xff1a;Pycharm 2024.1 对于Flask接口阻塞问题&#xff0…

沙漠里的气膜场馆,你见过吗?

在茫茫的沙漠之中&#xff0c;一座独特的建筑傲然而立&#xff0c;宛若一朵盛开的奇葩。这并非是传统的砖瓦建筑&#xff0c;也不是典型的钢筋混凝土构造&#xff0c;而是一座气膜场馆&#xff0c;以其轻盈的身姿和独特的设计&#xff0c;在沙漠中展现出了无与伦比的魅力。 这座…

java锁常识

AQS框架 AQS&#xff08;AbstractQueuedSynchronizer&#xff09;是 Java 中用于构建锁和同步器的基础框架。它提供了一种实现同步器的方式&#xff0c;使得开发者可以基于 AQS 构建各种类型的同步工具&#xff0c;如独占锁、共享锁、信号量等。 AQS 主要基于 FIFO 队列&…

Qt 集成OSG

Qt 你好 | 专注于Qt的技术分享平台 一&#xff0c;新建一个 QOsgWidget 类&#xff0c;继承自osgQOpenGLWidget #ifndef QOSGWIDGET_H #define QOSGWIDGET_H#include <QObject> #include <osgViewer/Viewer> #include <osgQOpenGL/osgQOpenGLWidget> class…

一种基于PET和ICT的双功能荧光探针,用于同时识别活细胞中的Cys和H2S

文章解读 文章设计了一种易于合成的双功能荧光探针NJB&#xff0c;通过明显的颜色和荧光变化用于对Cys和H2S的双位点响应&#xff0c;。在检测过程中&#xff0c;发生了光诱导电子转移 (photoinduced electron transfer, PET)和分子内电荷转移 (ICT)过程&#xff0c;NJB的颜色和…

ffmpeg支持MP3编码的方法

目录 现象 解决办法 如果有编译包没有链接上的情况 现象 解决办法 在ffmpeg安装包目录下 &#xff0c;通过./configure --list-encoders 和 ./configure --list-decoders 命令可以看到&#xff0c;ffmpeg只支持mp3解码&#xff0c;但是不支持mp3编码。 上网查寻后发现&…

SpringBoot之@Conditional衍生条件装配详解

文章目录 ☃️前言☃️简介☃️示例❄️❄️ConditionalOnProperty❄️❄️ConditionalOnClass❄️❄️ConditionalOnBean❄️❄️自定义条件 ☃️SpringBoot源码中使用☃️总结 欢迎来到 请回答1024 的博客 &#x1f353;&#x1f353;&#x1f353;欢迎来到 请回答1024的博客…

【圆桌论坛】个人作为嘉宾参与问答环节的总结,Create 2024百度AI开发者大会之AI智能体开发与应用论坛

目录 ⭐前言⭐讨论话题✨本质和价值✨端侧部署✨应用商业模式✨商业模式 ⭐主题总结⭐有趣分享 ⭐前言 首先&#xff0c;非常荣幸和开心作为开发者和创业者代表参加百度Create AI大会分论坛圆桌论坛的问答环节。 在分论坛活动开始前&#xff0c;参加了文心智能体平台&#xff…

JS 删除数组元素( 5种方法 )

No.内容链接1Openlayers 【入门教程】 - 【源代码示例300】 2Leaflet 【入门教程】 - 【源代码图文示例 150】 3Cesium 【入门教程】 - 【源代码图文示例200】 4MapboxGL【入门教程】 - 【源代码图文示例150】 5前端就业宝典 【面试题详细答案 1000】 文章目录 一、五种…

vue3中web前端JS动画案例(四)侧边栏横幅效果-右下角广告-淘宝案例

myJsAnimation.js, 这里使用了上次封装的动画方法&#xff0c;并进行了改造 /*** 动画的函数* dom 当前对象* JSON 传入元素对象的属性 {"width": 300, "opacity": 50}* * -------------------- 多物体运动&#xff0c;同时运动 ---传入JSON-------------*…
最新文章