2311rust,到38版本更新

1.35.0稳定版

此版本亮点是分别为Box<dyn FnOnce>,Box<dyn FnMut>Box<dyn Fn>实现了FnOnce,FnMutFn闭包特征.
此外,现在可按不安全的函数指针转换闭包.现在也可无参调用dbg!.

Box<dyn Fn*>实现Fn*装饰特征.

以前,如果要调用在盒子闭包中存储的函数,因为Box<dyn FnOnce>等实例没有实现相应的Fn*特征,则必须使用FnBox.

此版本中,可使用盒子函数.
以下代码现在可工作了:

fn foo(x: Box<dyn Fn(u8) -> u8>) -> Vec<u8> {vec![1, 2, 3, 4].into_iter().map(x).collect()
}

此外,现在可直接调用Box<dyn FnOnce>对象:

fn foo(x: Box<dyn FnOnce()>) {x()
}

强制闭包为不安全的fn指针

Rust1.19.0开始,可把未从环境中抓的闭包转换为函数指针.如,可编写:

fn twice(x: u8, f: fn(u8) -> u8) -> u8 {f(f(x))
}
fn main() {assert_eq!(42, twice(0, |x| x + 21));
}

但是,并未扩展到不安全函数指针.有了该版本Rust,现在可以这样做了.如:

//安全不变量是传递的"`不安全 fn"`指针的不变量.
unsafe fn call_unsafe_fn_ptr(f: unsafe fn()) {f()
}
fn main() {//安全性:没有不变量.装饰静态禁止不安全.unsafe {call_unsafe_fn_ptr(|| {dbg!();});}
}

无参调用dbg!()

该宏允许用环境快速检查某些式的值.如,运行时:

fn main() {let mut x = 0;if dbg!(x == 1) {x += 1;}dbg!(x);
}
...会看见:
[src/main.rs:4] x == 1 = false
[src/main.rs:8] x = 0

如上,调用call_unsafe_fn_ptr高级函数,现在也可不传递参数调用dbg!.在跟踪应用选取分支时非常有用.如,用:

fn main() {let condition = true;if condition {dbg!();}
}...你会看到:
[src/main.rs:5]

稳定库

复制浮点数A符号到B符号上
本版本中,已添加copysign新方法到f32f64浮点原语类型中:

f32::copysign
f64::copysign

即,可用它复制A数字符号B数字上.如:

fn main() {assert_eq!(3.5_f32.copysign(-0.42), -3.5);
}

检查Range是否包含值

Rust1.35.0Range类型上包含了一些新创建方法:

Range::contains
RangeFrom::contains
RangeTo::contains
RangeInclusive::contains
RangeToInclusive::contains

现在,可轻松检查给定值是否在某个内.如,可编写:

fn main() {if (0..=10).contains(&5) {println!("Five is included in zero to ten.");}
}

把借用的RefCell值映射并拆分为两部分

现在可为借入数据的不同组件,映射并拆分多个借用值,来借用RefCell值:

Ref::map_split
RefMut::map_split

通过闭包替换RefCell的值

RefCellreplace_with方便方法:

RefCell::replace_with

有了它,可舒适映射和替换单元格的当前值,并因取回旧值.

按地址(而不是值)哈希处理指针或引用

引入了:

ptr::hash

此函数原始指针并哈希处理它.使用ptr::hash,可避免哈希引用值,而是哈希地址.

复制Option<&T>的内容

Rust1.0.0开始,Option<&T>Option::cloned方法和Option<&mutT>就允许你在Some(_)时克隆内容.
然而,克隆有时很贵,而opt.cloned()方法没有提供提示.
在该版本的Rust中:
Option<&T>Option<&mut;T>,引入了Option::copied.
opt.copied()的功能与opt.cloned()的功能相同.但是,调用该方法需要T:Copy.使用此方法,可确保在T不再实现Copy时,代码停止编译.

更改Clippy

Clippy添加了一个新的drop_bounds检查.把绑定的T:Drop添加到泛型函数时,会触发此检查.如:

fn foo<T: Drop>(x: T) {}

绑定T:Drop几乎总是个错误,因为它排除了有很简单胶水的u8等类型.此外,T:Drop并没有直接考虑像String类没有有趣析构器行为的类型,而是按嵌入类型(如Vec<u8>)等有有趣析构器行为.

除了drop_bounds之外,此版本的Clippy还将lintredundant_closure拆分为redundant_closureredundant_closure_for_method_calls.

1.36.0稳定版

Rust1.36.0中,稳定了Future!

稳定了未来,给重要的crate,库和生态系统时间来准备async/.await.
alloc是稳定的
1.36.0之前,标准库由std,coreproc_macro仓库组成.核心仓库提供了IteratorCopy等核心功能,也可在#![no_std]环境中用,因为它没有强加要求.

同时,std仓库提供了Box<T>OS功能等类型,但要求全局分配器和其他OS功能为基础.

Rust1.36.0开始,依赖全局分配器的std部分,如Vec<T>,现在可在alloc仓库中使用.
然后,标准仓库会重新导出这些部件.虽然#![no_std]使用alloc的二进制文件仍需要每晚的Rust,#![no_std]库可在稳定的Rust中使用alloc仓库.

同时,普通没有#![no_std]二进制文件,可依赖此仓库.来支持用alloc支持#![no_std].

#![no_std]
extern crate alloc;
use alloc::vec::Vec;

MaybeUninit<T>而不是mem::uninitialized

已稳定下来MaybeUninit<T>类型.它不应假设MaybeUninit<T>是正确初化的T.

因此,可更安全渐进式初化,并在确定maybe_t:MaybeUninit<T>包含初化的T后最终使用.assume_init().

因为MaybeUninit<T>更安全,将弃用mem::uninitialized函数.

Rust2015NLL

如,你现在可编写:

fn main() {let mut x = 5;let y = &x;let z = &mut x; //在`1.31.0`之前禁止这样做.
}

新的HashMap<K,V>实现

基于SwissTable设计的hashbrown中的实现已取代HashMap<K,V>的实现.虽然接口相同,但HashMap<K,V>实现,现在平均速度更快,内存成本更低.

新的Cargo标志已稳定:--offline.

更改库

dbg!宏现在支持多个参数.
此外,多个API变成:

Layout::from_size_align_unchecked
mem::needs_drop
NonNull::dangling
NonNull::cast

新的API已稳定,包括:
1,task::Wakertask::Poll
2,VecDeque::rotate_leftVecDeque::rotate_right
3,Read::read_vectoredWrite::write_vectored
4,Iterator::copied
5,串的BorrowMut<str>
6,str::as_mut_ptr

1.37.0稳定版

通过类型别名引用枚举变体

现在可用类型别名引用枚举变体.如:

type ByteOption = Option<u8>;
fn increment_or_zero(x: ByteOption) -> u8 {match x {ByteOption::Some(y) => y + 1,ByteOption::None => 0,}
}

实现中,Self行为类似类型别名.因此,现在也可用Self::Variant引用枚举变体:

impl Coin {fn value_in_cents(&self) -> u8 {match self {Self::Penny => 1,Self::Nickel => 5,Self::Dime => 10,Self::Quarter => 25,}}
}

Rust现在允许通过"类型相关解析来引用枚举变体.

对宏使用未命名的const

现在,可用_创建无名常量项.如,在rustc编译器中,发现:

///类型大小断定,第一个参数是类型,第二个参数是期望大小.
#[macro_export]
macro_rules! static_assert_size {($ty:ty, $size:expr) => {const _: [(); $size] = [(); ::std::mem::size_of::<$ty>()];//注意此处的下划线.}
}
static_assert_size!(Option<Box<String>>, 8); //1.
static_assert_size!(usize, 8); //2.

注意第二个static_assert_size!(..):因为使用了无名常量,可在无名字冲突时,定义新项目.

按配置文件优化

rustc编译器现在通过-C profile-generate-C profile-use标志支持按配置文件优化(PGO).
PGO允许编译器根据实际工作负载优化代码.工作原理是编译器分两步优化:
1,首先,通过传递-C profile-generate标志给rustc来,用编译器插入的检测来构建程序.
然后,对示例数据运行检测程序,并写入配置文件.
2,然后,再次构建程序,这次使用-Cprofile-use标志收集的分析数据喂给rustc.使编译器更好放置代码,内联和其他优化.

[package]部分中声明键时,如果未传递--bin标志,cargo run默认为选二进制文件.

在枚举上#[repr(align(N))]]

#[repr(align(N))]属性可用来提高类型定义的对齐方式.以前,只允许在结构和联上使用该属性.现在也可在枚举中定义.

如,Align16类型期望按16位对齐,而没有#[repr(align(16))]自然对齐方式将为4:

#[repr(align(16))]
enum Align16 {Foo { foo: u32 },Bar { bar: u32 },
}

在枚举上使用#[repr(align(N))的语义与定义有该对齐的包装结构AlignN<T>然后使用AlignN<MyEnum>语义相同:

#[repr(align(N))]
struct AlignN<T>(T);

更改库

稳定了许多标准库:

BufReader::buffer和BufWriter::buffer
Cell::from_mut
Cell::as_slice_of_cells
DoubleEndedIterator::nth_back
Option::xor
{i,u}{8,16,32,64,128,size}::reverse_bits and Wrapping::reverse_bits
slice::copy_within

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nvm切换node后,没有npm

当我们想要在不同的 Node.js 版本之间切换的时候&#xff0c;通常会使用 nvm&#xff08;Node Version Manager&#xff09; 来完成。但是&#xff0c;当我们在使用 nvm 切换 Node.js 版本的时候&#xff0c;可能会遇到没有 npm 的情况。这种情况通常发生在我们在新环境或者重新…

Android---Gradle 构建问题解析

想必做 Android App 开发的对 Gradle 都不太陌生。因为有 Android Studio 的帮助&#xff0c;Android 工程师使用 Gradle 的门槛不算太高&#xff0c;基本的配置都大同小异。只要在 Android Studio 默认生成的 build.gradle 中稍加修改&#xff0c;就都能满足项目要求。但是&am…

『vue-router 要点』

参数或查询的改变并不会触发进入/离开的导航守卫&#xff0c;如何解决&#xff1a; 通过观察 $route 对象来应对这些变化&#xff0c; watch: {$route(to, from) {// 对路由变化作出响应...}}使用 beforeRouteUpdate 的组件内守卫。 beforeRouteUpdate(to, from, next) {// re…

面试题c/c++ --STL 算法与数据结构

1.6 STL 模板 模板底层实现&#xff1a;编译器会对函数模板进行两次编译&#xff0c; 在声明的地方对模板代码本身进行编译&#xff0c; 在调用的地方对参数替换后的代码进行编译。 模板传参分析 模板重载 vector 是动态空间&#xff0c; 随着元素的加入&#xff0c; 它的内…

Apache Airflow (十二) :PythonOperator

&#x1f3e1; 个人主页&#xff1a;IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 &#x1f6a9; 私聊博主&#xff1a;加入大数据技术讨论群聊&#xff0c;获取更多大数据资料。 &#x1f514; 博主个人B栈地址&#xff1a;豹哥教你大数据的个人空间-豹…

内网穿透的应用-如何在Docker中部署MinIO服务并结合内网穿透实现公网访问本地管理界面

文章目录 前言1. Docker 部署MinIO2. 本地访问MinIO3. Linux安装Cpolar4. 配置MinIO公网地址5. 远程访问MinIO管理界面6. 固定MinIO公网地址 前言 MinIO是一个开源的对象存储服务器&#xff0c;可以在各种环境中运行&#xff0c;例如本地、Docker容器、Kubernetes集群等。它兼…

HTTPS流量抓包分析中出现无法加载key

HTTPS流量抓包分析(TLSv1.2)&#xff0c;这篇文章分析的比较透彻&#xff0c;就不班门弄斧了 https://zhuanlan.zhihu.com/p/635420027 写个小问题&#xff1a;RSA密钥对话框加载rsa key文件的时候注意不要在中文目录下&#xff0c;否则会提示&#xff1a;“Enter the passwor…

单张图像3D重建:原理与PyTorch实现

近年来&#xff0c;深度学习&#xff08;DL&#xff09;在解决图像分类、目标检测、语义分割等 2D 图像任务方面表现出了出色的能力。DL 也不例外&#xff0c;在将其应用于 3D 图形问题方面也取得了巨大进展。 在这篇文章中&#xff0c;我们将探讨最近将深度学习扩展到单图像 3…

【MySql】13- 实践篇(十一)

文章目录 1. 自增主键为什么不是连续的&#xff1f;1.1 自增值保存在哪儿&#xff1f;1.2 自增值修改机制1.2.1 自增值的修改时机1.2.2 自增值为什么不能回退? 1.3 自增锁的优化1.3.1 自增锁设计历史 2. Insert语句为何很多锁?2.1 insert … select 语句2.2 insert 循环写入2…

以“防方视角”观Shiro反序列化漏洞

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 案例概述02 攻击路径03 防方思路 01 案例概述 这篇文章来自微信公众号“潇湘信安”&#xff0c;记录的某师傅如何发现、利用Shiro反序列化漏洞&#xff0c;又是怎样绕过火绒安全防护实现文件落地、…

BLIP-2:冻结现有视觉模型和大语言模型的预训练模型

Li J, Li D, Savarese S, et al. Blip-2: Bootstrapping language-image pre-training with frozen image encoders and large language models[J]. arXiv preprint arXiv:2301.12597, 2023. BLIP-2&#xff0c;是 BLIP 系列的第二篇&#xff0c;同样出自 Salesforce 公司&…

C 语言结构体(struct)

C 语言结构体(struct) 在本教程中&#xff0c;您将学习C语言编程中的结构类型。您将借助示例学习定义和使用结构。 在C语言编程中&#xff0c;有时需要存储实体的多个属性。 实体不必仅具有一种类型的所有信息。 它可以具有不同数据类型的不同属性。 C 数组允许定义可存储相…

Java 的异常体系

Java 中 Throwable 是所有异常和错误的超类&#xff0c;两个直接子类是 Error&#xff08;错误&#xff09;和 Exception&#xff08;异常&#xff09; 在Java中&#xff0c;异常的根类是java.lang.Throwable类&#xff0c;而根类又分为两大类&#xff1a;Error和Exception&…

浅谈开源和闭源的认知

目录 在大型模型的发展中&#xff0c;开源和闭源两种截然不同的开发模式扮演着关键的角色。开源模式通过促进技术共享&#xff0c;吸引了大量优秀人才的加入&#xff0c;从而推动了大模型领域的不断创新。与此相反&#xff0c;闭源模式则着重于保护商业利益和技术优势&#xff…

【uni-app】设置背景颜色相关

1. 全局页面背景色设置&#xff1a; 在App.vue的style样式表中设置 <style> page {background-color: #F0AD4E; } </style> 2. 顶部导航栏背景色设置&#xff1a; 在pages.json页面路由中&#xff0c;globalStyle设置 "globalStyle": {"navi…

物流实时数仓:采集通道搭建

系列文章目录 物流实时数仓&#xff1a;环境搭建 文章目录 系列文章目录前言一、环境准备1.前置环境2.hbase安装1.上传并解压2.配置环境变量3.拷贝jar包4.编写配置文件5.分发配置文件 3.Redis安装1.安装需要的编译环境2.上传并解压文件3.编译安装4.后台访问 4.ClickHouse安装5…

OpenCvSharp从入门到实践-(01)认识OpenCvSharp开发环境搭建

目录 一、OpenCV 二、OpenCvSharp 三、OpenCvSharp开发环境搭建 四、下载 五、其他 一、OpenCV OpenCV是基于Apache2.0许可&#xff08;开源&#xff09;发行的跨平台计算机视觉和机器学习函数库&#xff0c;支持Windows、Linux、Android和Mac OS操作系统。OpenCV由一系…

Oracle for Windows安装和配置——Oracle for Windows net配置

2.3. Oracle for Windows net配置 2.3.1. Oracle net配置 2.3.1.1. Oracle net简介 前述章节中,我们只是安装了数据库软件,创建了数据库,测试在服务器本地连接查询数据库。但还不能通过网络远程连接访问数据库,因为我们还没配置用来远程连接访问该数据库的组件Oracle ne…

【Linux】缓冲区+磁盘+动静态库

一、缓冲区 1、缓冲区的概念 缓冲区的本质就是一段用作缓存的内存。 2、缓冲区的意义 节省进程进行数据IO的时间。进程使用fwrite等函数把数据拷贝到缓冲区或者外设中。 3、缓冲区刷新策略 3.1、立即刷新&#xff08;无缓冲&#xff09;——ffush() 情况很少&#xff0c…

【蓝桥杯 第十五届模拟赛 Java B组】训练题(A - I)

目录 A、求全是字母的最小十六进制数 B、Excel表格组合 C、求满足条件的日期 D、 取数字 - 二分 &#xff08;1&#xff09;暴力 &#xff08;2&#xff09;二分 E、最大连通块 - bfs F、哪一天&#xff1f; G、信号覆盖 - bfs &#xff08;1&#xff09;bfs&#xf…