2311rust到31版本更新

1.27.1稳定版

在此修补程序前,下例在编译器内部恐慌.

fn main() {let a = vec!["".to_string()];a.iter().enumerate().take_while(|(_, &t)| false).collect::<Vec<_>>();
}

1.27.1拒绝上述代码,并显示以下错误消息:

error[E0507]: cannot move out of borrowed content--> src/main.rs:4:30|4 |             .take_while(|(_, &t)| false)|                              ^-|                              |||                              |hint: to prevent move, use `ref t` or `ref mut t`|                              cannot move out of borrowed content

1.27.2稳定版

fn transmute_lifetime<'a, 'b, T>(t: &'a (T,)) -> &'b T {match (&t, ()) {((t,), ()) => t,}
}
fn main() {let x = {let y = Box::new((42,));transmute_lifetime(&y)};println!("{}", x);
}

1.27.2拒绝上述代码.

1.28.0稳定版

全局分配器
分配器是Rust中程序,运行时从系统取内存的方式.以前,Rust禁止改变取内存方式,这阻止了某些用例.在某些平台上,即使用jemalloc,在其他平台上,即使用系统分配器,但用户无法控制此关键组件.

1.28.0中,#[global_allocator]属性现在是稳定的,它允许Rust程序设置分配器系统分配器,并通过实现GlobalAlloc特征来定义新的分配器.

某些平台上Rust程序的默认分配器是jemalloc.标准库现在提供了需要时可切换到的系统分配器句柄,只需要声明为静态并用#[global_allocator]属性标记它.

use std::alloc::System;
#[global_allocator]
static GLOBAL: System = System;//系统
fn main() {let mut v = Vec::new();//这使用系统分配器分配内存.v.push(1);
}

但是,有时想为给定的应用域自定义分配器.实现GlobalAlloc特征即可.

改进了设置格式的错误消息
仍在诊断,重点是格式:

format!("{_foo}", _foo = 6usize);

以前,错误消息相对较差:

error: invalid format string: expected `'}'`, found `'_'`|
2 |     format!("{_foo}", _foo = 6usize);|             ^^^^^^^^

现在,诊断并告诉格式串无效的具体原因:
错误:格式串无效:"_foo"参数名无效

  |
2 |     let _ = format!("{_foo}", _foo = 6usize);|                       ^^^^ invalid argument name in format string|= note: argument names cannot start with an underscore

库稳定

另一个重要稳定性是非零数类型.这些是标准:NonZeroU8,NonZeroU16,NonZeroU32,NonZeroU64,NonZeroU128NonZeroUsize正整数类型的包装器.

这允许大小优化,如,Option<u8>有两个字节大,但Option<NonZeroU8>只有一个字节大.注意,即使NonZeroU8在另一个结构中包装,也有此优化;
下例说明,尽管在Option中放置Door,但仍有1个字节大.优化也适合用户定义的枚举:Option并不特殊.

use std::mem;
use std::num::NonZeroU8;
struct Key(NonZeroU8);
struct Door {key: Key,
}
fn main() {assert_eq!(mem::size_of::<Door>(), 1);assert_eq!(mem::size_of::<Option<Door>>(), 1);
}

Cargo现在不再允许发布修改src目录构建脚本的crate.crate中的src目录应该是不变的.

1.29.0稳定版

cargo fix可自动修复带警告代码
cargo clippy是一堆抓常见错误并改进Rust代码的lints.

货物修复
子命令:cargo fix.如果你以前用Rust编写过代码,你可能以前见过编译器警告.如,考虑:

fn do_something() {}
fn main() {for i in 0..100 {do_something();}
}

在此,调用了100do_something.但从不使用i变量.所以Rust警告说:

cargo buildCompiling myprogram v0.1.0 (file:///path/to/myprogram)
warning: unused variable: `i`--> src\main.rs:4:9|
4 |     for i in 1..100 {|         ^ help: consider using `_i` instead|= note: #[warn(unused_variables)] on by defaultFinished dev [unoptimized + debuginfo] target(s) in 0.50s

因此,它建议改用_i.可自动修复:

cargo fixChecking myprogram v0.1.0 (file:///C:/用户/steve/tmp/fix)Fixing src\main.rs (1 fix)Finished dev [unoptimized + debuginfo] target(s) in 0.59s

如果再次查看src\main.rs,会看到代码已更改:

fn do_something() {}
fn main() {for _i in 0..100 {do_something();}
}

现在使用的是_i,将不再有警告.
现在可用Rustup查看cargo clippy的预览.Clippy是可针对Rust代码运行的大量额外警告.
如:

let mut lock_guard = mutex.lock();
std::mem::drop(&lock_guard)
operation_that_requires_mutex_to_be_unlocked();

代码语法上是正确的,但可能有死锁!你看,删除了lock_guard的引用,而不是警卫自身.删除引用是个空操作,因此这几乎可肯定是个错误.

可从Rustup获得Clippy的预览:

rustup component add clippy-preview

然后运行它:

cargo clippy
error: calls to `std::mem::drop` with a reference instead of an owned value. Dropping a reference does nothing.--> src\main.rs:5:5|
5 |     std::mem::drop(&lock_guard);|     ^^^^^^^^^^^^^^^^^^^^^^^^^^^|= note: #[deny(drop_ref)] on by default
note: argument has type &std::result::Result<std::sync::MutexGuard<'_, i32>, std::sync::PoisonError<std::sync::MutexGuard<'_, i32>>>--> src\main.rs:5:20|
5 |     std::mem::drop(&lock_guard);|                    ^^^^^^^^^^^= help: for further information visit https://rust-lang-nursery.github.io/rust-clippy/v0.0.212/index.html#drop_ref

帮助消息中可看出,可查看clippy提供的所有lint.
库稳定
此版本稳定了三个API:

Arc<T>::downcast
Rc<T>::downcast
Iterator::flatten

此外,现在可比较&strOsString.

除此外,Cargo现在试修复已被git合并破坏的锁文件.可传递--locked禁止此行为.
cargo doc还增加了一个新标志:--document-private-items.默认,cargo doc只文档化公开内容.
但是,如果在处理自己的crate,且有供自己参考的内部文档,--document-private-items项为所有而不仅是公开项目生成文档.

1.29.1稳定版

如果传递大数str::repeat,可能导致整数溢出后的缓冲溢出.如果不调用str::repeat函数,则不受影响.
已解决.

1.30.0稳定版

过程宏

早在Rust1.15中,就宣布了可定义"自定义继承"的功能.如,使用serde_derive,你可

#[derive(Serialize, Deserialize, Debug)]
struct Pet {name: String,
}

并用serde_json相互转换PetJSON,因为serde_derive过程宏中定义了SerializeDeserialize.
Rust1.30在此基础上扩展,增加了定义另外两个"类属性过程宏"和"类函数过程宏",高级宏的能力.

类似属性类似自定义继承宏,但它们不是仅为#[derive]属性生成代码,且允许创建自己的自定义属性.
也更灵活:继承仅适合结构和枚举,但属性可放在比如函数等地方.作为使用类似属性的宏的示例,在使用Web应用框架时,可能有类似此的内容:

#[route(GET, "/")]
fn index() {

#[route]属性由框架自身按过程宏定义.签名如下:

#[proc_macro_attribute]
pub fn route(attr: TokenStream, item: TokenStream) -> TokenStream {

在此,有两个输入TokenStreams:第一个是属性自身的内容,即GET与"/"的东西.第二个是属性附加到的主体,本例中为fn index(){}函数主体的其余部分.
类似函数的宏定义类似调用函数的宏.如,gnome-class仓库有个定义Rust中的GObject类的过程宏:

gobject_gen!(class MyClass: GObject {foo: Cell<i32>,bar: RefCell<String>,}impl MyClass {virtual fn my_virtual_method(&self, x: i32) {//...用X做点什么......}}
)

就像以一堆代码参数函数.此宏定义如下:

#[proc_macro]
pub fn gobject_gen(input: TokenStream) -> TokenStream {

类似继承宏的签名:取括号内的令牌,并返回要生成的代码.

用和宏

现在,可用use关键字把宏引入域中.如,要使用serde-jsonjson宏,过去这样:

#[macro_use]
extern crate serde_json;
let john = json!({"name": "John Doe","age": 43,"phones": ["+44 1234567","+44 2345678"]
});

但现在,你会这样:

extern crate serde_json;
use serde_json::json;//使用.
let john = json!({"name": "John Doe","age": 43,"phones": ["+44 1234567","+44 2345678"]
});

使宏与其他项目更一致,且无需macro_use注解.

最后,proc_macro仓库已稳定,为你提供了编写此类宏期望的API.还显著改进了API错误,且像synquote等仓库已在使用它们.如,之前:

#[derive(Serialize)]
struct Demo {ok: String,bad: std::thread::Thread,
}

给出此错误:

error[E0277]: the trait bound `std::thread::Thread: _IMPL_SERIALIZE_FOR_Demo::_serde::Serialize` is not satisfied--> src/main.rs:3:10|
3 | #[derive(Serialize)]|          ^^^^^^^^^ the trait `_IMPL_SERIALIZE_FOR_Demo::_serde::Serialize` is not implemented for `std::thread::Thread`

现在给出:

error[E0277]: the trait bound `std::thread::Thread: serde::Serialize` is not satisfied--> src/main.rs:7:5|
7 |     bad: std::thread::Thread,|     ^^^ the trait `serde::Serialize` is not implemented for `std::thread::Thread`

改进模块系统

首先是现在预引入外部仓库,即:

//旧
let json = ::serde_json::from_str("...");
//新增功能
let json = serde_json::from_str("...");

因为Rust模块,并不总是需要"旧"风格:

extern crate serde_json;
fn main() {//这很好;在仓库根目录下,所以在此`"serde_json"`在域内let json = serde_json::from_str("...");
}
mod foo {fn bar() {//这不行;在`"foo"`名字空间中,且未在此声明`"serde_json"`let json = serde_json::from_str("...");}//一个选项,是在模块内"用"它use serde_json;fn baz() {//另一个选项是使用`'::serde_json'`,因此用的是`绝对`路径而不是相对路径let json = ::serde_json::from_str("...");}
}

移动函数到子模块并中断一些代码,并不好.现在,它检查路径的第一部分,查看它是否是个外部仓库,如果是,无论模块层次位置,都可用它.

最后,use还支持引入crate开头的带路径项至域:

mod foo {pub fn bar() {//...}
}
//旧
use ::foo::bar;
//或
use foo::bar;
//新增功能
use crate::foo::bar;

crate关键字表示想从crate根目录开始路径.以前,后指定路径总是从crate根目录开始,但直接引用项目的路径从本地路径开始,即路径行为不一致:

mod foo {pub fn bar() {//...}
}
mod baz {pub fn qux() {//旧::foo::bar();//不管用,这与`"use"`不同:`foo::bar();`//新增功能crate::foo::bar();}
}

所有这些变化结合在一起,可更直接理解路径的解析方式.除了use语句,一旦看到像a::b::c此路径,你都可如下:
1,是仓库名字,然后在里面找b::c.
2,是crate关键字,则从crate的根目录中找b::c.
3,否则,从模块当前位置查找a::b::c.

仍适用,总是从crate根目录开始使用路径的旧行为.但是,在切换到新风格后,给路径统一应用这些规则,这样移动代码时,要调整导入的次数要少得多.

原始标识

现在,可用一些新语法,用关键字作为标识:

//定义叫`"for"`的局部变量
let r#for = true;
//定义叫`"for"`的函数
fn r#for() {//...
}
//调用该函数
r#for();

此版本稳定了一些新API:

Ipv4Addr::{BROADCAST, LOCALHOST, UNSPECIFIED}
Ipv6Addr::{LOCALHOST, UNSPECIFIED}
Iterator::find_map

此外,trim_left等功能,可消除某些文本一侧的空白.但是,在考虑从右到左(RTL)语言时,会混淆"右"和"左"含义.
因此,给这些API引入新名:

trim_left -> trim_start
trim_right -> trim_end
trim_left_matches -> trim_start_matches
trim_right_matches -> trim_end_matches

该版本中,Cargo最大的特点是现在有个进度栏!

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

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

相关文章

【2021集创赛】基于arm Cortex-M3处理器与深度学习加速器的实时人脸口罩检测 SoC

团队介绍 参赛单位&#xff1a;深圳大学 队伍名称&#xff1a;光之巨人队 指导老师&#xff1a;钟世达、袁涛 参赛队员&#xff1a;冯昊港、潘家豪、慕镐泽 图1 团队风采 1. 项目简介 新冠疫情席卷全球&#xff0c;有效佩戴口罩可以极大程度地减小病毒感染的风险。本项目开发…

【数据结构&C++】二叉平衡搜索树-AVL树(25)

前言 大家好吖&#xff0c;欢迎来到 YY 滴C系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 目录 一.AVL树的概念二.AVL树节点的定义(代码…

mysql练习1

-- 1.查询出部门编号为BM01的所有员工 SELECT* FROMemp e WHEREe.deptno BM01; -- 2.所有销售人员的姓名、编号和部门编号。 SELECTe.empname,e.empno,e.deptno FROMemp e WHEREe.empstation "销售人员";-- 3.找出奖金高于工资的员工。 SELECT* FROMemp2 WHE…

『Spring Boot Actuator Spring Boot Admin』 实现应用监控管理

前言 本文将会使用 Spring Boot Actuator 组件实现应用监视和管理&#xff0c;同时结合 Spring Boot Admin 对 Actuator 中的信息进行界面化展示&#xff0c;监控应用的健康状况&#xff0c;提供实时警报功能 Spring Boot Actuator 简介 官方文档&#xff1a;Production-rea…

Linux 怎样通过win 远程桌面连接链接Linux后台服务器的可视化图形界面

目的概述&#xff1a;因不想后台直接操作&#xff08;操作不便&#xff09;&#xff0c;所以想到能否基于xrdp协议服务利用 win自带的远程桌面服务&#xff0c;链接到后台&#xff0c;类似于vnc的使用方式&#xff0c;涉及操作系统版本&#xff1a;win11 、 CentOS 7.4 、CentO…

openai/chatgpt的api接口,各个模型的最大输入token一览表

chatgpt的各个3.5api模型接口的最大输入量一览表&#xff1a; MODELDESCRIPTIONCONTEXT WINDOWTRAINING DATAgpt-3.5-turbo-1106Updated GPT 3.5 Turbo New The latest GPT-3.5 Turbo model with improved instruction following, JSON mode, reproducible outputs, parallel…

python算法例10 整数转换为罗马数字

1. 问题描述 给定一个整数&#xff0c;将其转换为罗马数字&#xff0c;要求返回结果的取值范围为1~3999。 2. 问题示例 4→Ⅳ&#xff0c;12→Ⅻ&#xff0c;21→XⅪ&#xff0c;99→XCIX。 3. 代码实现 def int_to_roman(num):val [1000, 900, 500, 400,100, 90, 50, 40…

蓝桥杯每日一题2023.11.19

题目描述 “蓝桥杯”练习系统 (lanqiao.cn) 题目分析 首先想到的方法为dfs去寻找每一个数&#xff0c;但发现会有超时 #include<bits/stdc.h> using namespace std; const int N 2e5 10; int n, cnt, a[N]; void dfs(int dep, int sum, int start) {if(dep 4){if(s…

SpirngBoot + Vue 前后端分离开发工具代码

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Java从入门到精通 ✨特色专栏&#xf…

软件测试技术之地图导航的测试用例

外观测试 屏幕显示不能有花屏、黑点和闪屏&#xff0c;清晰度、亮度、颜色要正常。 检测所有按键都能起到相应作用&#xff0c;是否手感不良。 UI显示状态、颜色、清晰度、效果。 控制&#xff1a;放大&#xff0c;缩小&#xff0c;音量调节功能测试。 交叉路口查询测试&am…

Python OpenCV 视频抽帧处理并保存

上篇文章中基于OpenCV实现图像处理后&#xff0c;类似的&#xff0c;也可以对视频进行处理。OpenCV库可以将视频的每一帧读取出来&#xff0c;然后对每一帧图像做相应的操作&#xff0c;并保存成新的视频。 1. 读取视频&#xff0c;获取相关参数 import cv2 import numpy as…

【华为OD题库-027】代码编辑器-java

题目 某公司为了更高效的编写代码,邀请你开发一款代码编辑器程序。程序的输入为已有的代码文本和指令序列&#xff0c;程序需输出编辑后的最终文本。指针初始位置位于文本的开头。 支持的指令(X为大于等于0的整数,word为无空格的字符串): FORWARD X&#xff1a;指针向前(右)移动…

app使用

font-face{font-family:‘kaishu’; src: url(data:application/font-ttf;charsetutf-8;base64,AAEAAAASAQAABAAgRFNJR5PpVzIAAAEsAAAacEdTVUIzhvftAAAbnAAAAXBPUy8yY8pHoQAAHQwAAABWY21hcAsTB9YAAB1kAADD5GN2dCAvAiIAADhSAAAA5pmcGdt/siFHQAA5OQAAAOiZ2FzcAAXAAkAAOiIAAAAEGds…

GEE生物量和碳储量——指定研究区利用遥感影像红色波段阈值(大津法)提取森林范围

简介 森林提取是指利用遥感技术从高分辨率遥感影像中自动或半自动地提取森林分布信息的过程。传统的森林提取方法主要基于数学模型和规则,但随着深度学习技术的发展,利用卷积神经网络(CNN)进行森林提取的方法越来越受到关注。 具体的步骤如下: 1. 数据获取:获取高分辨率…

HAL库STM32串口开启DMA接收数据

STM32CubeMx的配置 此博客仅仅作为记录&#xff0c;这个像是有bug一样&#xff0c;有时候好使&#xff0c;有时候不好&#xff0c;所以趁现在好使赶紧记录一下&#xff0c;很多地方用到串口接收数据&#xff0c;DMA又是一种非常好的接收方式&#xff0c;可以节约CPU的时间&…

Redis(哈希Hash和发布订阅模式)

哈希是一个字符类型字段和值的映射表。 在Redis中&#xff0c;哈希是一种数据结构&#xff0c;用于存储键值对的集合。哈希可以理解为一个键值对的集合&#xff0c;其中每个键都对应一个值。哈希在Redis中的作用主要有以下几点&#xff1a; 1. 存储对象&#xff1a;哈希可以用…

米家竞品分析

一、项目描述 1. 竞品分析描述 分析市场直接竞品和潜在竞品&#xff0c;优化产品核心结构和页面布局&#xff0c;确立产品核心功能定位。了解目标用户核心需求&#xff0c;挖掘用户魅力型需求&#xff0c;以及市场现状为产品迭代做准备。 2. 产品测试环境 二、市场 1. 行业…

css 设置网页最小字体为12px

谷歌浏览器默认最小字体为12px&#xff0c;但保不准万一有一天谷歌取消这个默认设置&#xff0c;或者一些人在设置中改了最小字体&#xff0c;为了防止万一&#xff0c;故系统设置了最小字体&#xff0c;主要利用了min和var的特性 :root {--responsive-font-size-primary: max…

AI自动直播软件,ai无人直播工具2.0支持多平台矩阵直播一键同步直播脚本内容【直播脚本+使用技术教程】

AI实景直播软件简介&#xff1a; 支持一台手机自动直播&#xff0c;支持语音和文字同时回复&#xff0c;商品自动弹窗&#xff0c;支持抖音、快手、视频号、美团平台直播&#xff0c;支持矩阵直播&#xff0c;一键同步直播脚本内容。 设备需求&#xff1a; 安卓手机&#xf…

TensorRT量化实战课YOLOv7量化:YOLOv7-QAT量化

目录 前言1. YOLOv7-QAT流程2. QAT训练流程 前言 手写 AI 推出的全新 TensorRT 模型量化实战课程&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考。 该实战课程主要基于手写 AI 的 Latte 老师所出的 TensorRT下的模型量化&#xff0c;在其课程的基础上&#xff…