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设计师等。 内容创作者:负责编写网站内容,包括文章、图片和视频。 项目经理:协调团队工作,确保项目按计划进行。 数字营销:帮助推广和市场…...

RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...

python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...

Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...

如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...

WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...

基于开源AI智能名片链动2 + 1模式S2B2C商城小程序的沉浸式体验营销研究
摘要:在消费市场竞争日益激烈的当下,传统体验营销方式存在诸多局限。本文聚焦开源AI智能名片链动2 1模式S2B2C商城小程序,探讨其在沉浸式体验营销中的应用。通过对比传统品鉴、工厂参观等初级体验方式,分析沉浸式体验的优势与价值…...