2311rust,到38版本更新
1.35.0稳定版
此版本亮点是分别为Box<dyn FnOnce>,Box<dyn FnMut>和Box<dyn Fn>实现了FnOnce,FnMut和Fn闭包特征.
此外,现在可按不安全的函数指针转换闭包.现在也可无参调用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新方法到f32和f64浮点原语类型中:
f32::copysign
f64::copysign
即,可用它复制A数字的符号到B数字上.如:
fn main() {assert_eq!(3.5_f32.copysign(-0.42), -3.5);
}
检查Range是否包含值
Rust1.35.0在Range类型上包含了一些新创建方法:
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的值
在RefCell上replace_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_closure和redundant_closure_for_method_calls.
1.36.0稳定版
在Rust1.36.0中,稳定了Future!
稳定了未来,给重要的crate,库和生态系统时间来准备async/.await.
alloc是稳定的
在1.36.0之前,标准库由std,core和proc_macro仓库组成.核心仓库提供了Iterator和Copy等核心功能,也可在#![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函数.
Rust2015的NLL
如,你现在可编写:
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::Waker和task::Poll
2,VecDeque::rotate_left和VecDeque::rotate_right
3,Read::read_vectored和Write::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
相关文章:
2311rust,到38版本更新
1.35.0稳定版 此版本亮点是分别为Box<dyn FnOnce>,Box<dyn FnMut>和Box<dyn Fn>实现了FnOnce,FnMut和Fn闭包特征. 此外,现在可按不安全的函数指针转换闭包.现在也可无参调用dbg!. 为Box<dyn Fn*>实现Fn*装饰特征. 以前,如果要调用在盒子闭包中存储的…...
腾讯云4核8G服务器配置价格表,轻量和CVM标准型S5实例
腾讯云4核8G服务器S5和轻量应用服务器优惠价格表,轻量应用服务器和CVM云服务器均有活动,云服务器CVM标准型S5实例4核8G配置价格15个月1437.3元,5年6490.44元,轻量应用服务器4核8G12M带宽一年446元、529元15个月,腾讯云…...
Android 屏幕适配
目录 一、为什么要适配 二、几个重要的概念 2.1 屏幕尺寸 2.2 屏幕分辨率 2.3 屏幕像素密度 2.4 屏幕尺寸、分辨率、像素密度三者关系 三、常用单位 3.1 密度无关像素(dp) 3.2 独立比例像素(sp) 3.3 dp与px的转换 四、解决方案 4.1 今日头条…...
Python使用Mechanize库完成自动化爬虫程序
目录 引言 一、了解Mechanize库 二、安装Mechanize库 三、使用Mechanize库发送HTTP请求 四、使用Mechanize库解析HTML页面 五、使用Mechanize库模拟用户输入 六、使用Mechanize库处理JavaScript动态生成的内容 七、使用Mechanize库处理登录和表单提交的常见问题 总结 …...
【Shell脚本入门】
Shell中的特殊符号 1.$ 美元符号,用来表示变量的值。 如变量NAME的值为Mike,则使用$NAME就可以得到“Mike”这个值。2.# 井号,除了做为超级用户的提示符之外,还可以在脚本中做为注释的开头字母,每一行语句中ÿ…...
redis大全
redis-cli 常用命令 redis常用命令 redis数据结构 redis数据结构 redis持久化存储 持久化存储 redis事务 redis事务 redis管道 管道 redis7集群搭建 集群 redis常见问题以及解决方案 常见问题以及解决方案 redis面试题 面试题 redis高级案列case 高级case sp…...
linux rsyslog日志采集格式设定五
linux rsyslog日志采集格式设定五 1.创建日志接收模板 打开/etc/rsyslog.conf文件,在GLOBAL DIRECTIVES模块下任意位置添加以下内容 命令: vim /etc/rsyslog.conf 测试:rsyslog.conf文件结尾添加以下内容 $template ztj,"%fromhost-ip% %app-name% %syslogseveri…...
uni-app:如何配置uni.request请求的超时响应时间(全局+局部)
方法一:全局配置响应时间 一、进入项目的manifest.json的代码视图模块 二、写入代码 "networkTimeout": {"request": 5000 }, 表示现在request请求响应时间最多位5秒 方法二:局部设置响应时间 一、直接在uni.request中写入属性…...
AI中文版怎么用,版本分享,GPT官网入口
网页版上线啦,在线助力大学生、上班族的高效生活! GPT4.0是OpenAI最新推出的聊天模型,它的语言理解和生成能力比以前的版本更强大。对于忙碌的上班族来说,GPT4.0能帮助你高效处理工作中的大部分写作任务,比如撰写报告…...
mysql数据库通过binlog恢复数据
1:通过命令查询是否开启 show variables like log_bin2:查看binlog文件存放目录 show variables like %datadir%3:通过positon恢复 mysqlbinlog --start-position219 --stop-position636 --databasetest "/data/binlog.00001" …...
【unity插件】UGUI的粒子效果(UI粒子)—— Particle Effect For UGUI (UI Particle)
文章目录 前言插件地址描述特征Demo 演示如何玩演示对于 Unity 2019.1 或更高版本对于 Unity 2018.4 或更早版本 用法基本上是用法使用您现有的 ParticleSystem 预制件带 Mask 或 RectMask2D 组件脚本用法UIParticleAttractor 组件开发说明常见问题解答:为什么我的粒…...
高教社杯数模竞赛特辑论文篇-2023年C题:基于历史数据的蔬菜类商品定价与补货决策模型(附获奖论文及R语言和Python代码实现)(中)
目录 六、 问题三模型建立与求解 6.1 问题三求解思路 6.2 问题三模型建立 6.2.1 模型假定和预处理...
element-ui plus 文件上传组件,设置单选,并支持替换和回显
遇到的坑: 1、设置limit属性为1后,on-change属性不生效 2、on-exceed属性虽然值改变,但是回显没有随之变化 3、由于element-ui plus版本file-list值出现问题 最后的解决方案决定不设置 limit 属性,通过 on-change 中的判断来控制数…...
ZYNQ7000---FLASH读写
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、Flash是什么?二、Flash的分类1、内部结构(接口)区分:2、外部接口区分:SPIQPSI Flash: QSPI 控制…...
SpringMVC log4j1升级log4j2
整个升级过程耗时5个小时,中间耗时最长的是找合适的包和升级后日志无法打印以及无法控制日志输出位置,完成后感觉其实很简单,如果一开始就能看到我现在写的笔记,可能几分钟就搞定了。 第一步:首先上log4j2所需要的包 …...
MATLAB算法实战应用案例精讲-【图像处理】机器视觉(基础篇)(十一)
目录 几个相关概念 1、焦点(focus) 2、弥散圆(circle of confusion) 3、景深(depth of field) 知识储备 线阵相机...
UE的PlayerController方法Convert Mouse Location To World Space
先上图: Convert Mouse Location To World这是PlayerController对象中很重要的方法。 需要说明的是两个输出值。 第一个是World Location,这是个基于世界空间的位置值,一开始我以为这个值和当前摄像机的位置是重叠的,但是打印出来…...
【Qt之QStandardItemModel】使用,tableview、listview、treeview设置模型
1. 引入 QStandardItemModel类提供了一个通用的模型,用于存储自定义数据。 以下是其用法:该类属于gui模块,因此在.pro中,需添加QT gui,如果已存在,则无需重复添加。 首先,引入头文件ÿ…...
mongodb 6/7的 windows安装问题
https://cloud.tencent.com/developer/article/2205068...
网站建设所需要的主要资源相关介绍
人力资源: 网站开发人员:前端开发、后端开发、UI/UX设计师等。 内容创作者:负责编写网站内容,包括文章、图片和视频。 项目经理:协调团队工作,确保项目按计划进行。 数字营销:帮助推广和市场…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...
