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设计师等。 内容创作者:负责编写网站内容,包括文章、图片和视频。 项目经理:协调团队工作,确保项目按计划进行。 数字营销:帮助推广和市场…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
