当前位置: 首页 > news >正文

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最大的特点是现在有个进度栏!

相关文章:

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 ou…...

【Python百宝箱】视觉算法秀:Python图像处理舞台上的巅峰对决

前言 在数字化时代&#xff0c;图像处理技术已经成为科技和计算机领域中不可或缺的一部分。从医学影像到计算机视觉&#xff0c;图像处理为我们提供了无限的可能性。Python作为一种灵活而强大的编程语言&#xff0c;在图像处理领域表现出色&#xff0c;拥有丰富的库和工具。本…...

Flutter 中在单个屏幕上实现多个列表

今天&#xff0c;我将提供一个实际的示例&#xff0c;演示如何在单个页面上实现多个列表&#xff0c;这些列表可以水平排列、网格格式、垂直排列&#xff0c;甚至是这些常用布局的组合。 下面是要做的&#xff1a; 实现 让我们从创建一个包含产品所有属性的产品模型开始。 …...

YOLOv8 加持 MobileNetv3,目标检测新篇章

🗝️YOLOv8实战宝典--星级指南:从入门到精通,您不可错过的技巧   -- 聚焦于YOLO的 最新版本, 对颈部网络改进、添加局部注意力、增加检测头部,实测涨点 💡 深入浅出YOLOv8:我的专业笔记与技术总结   -- YOLOv8轻松上手, 适用技术小白,文章代码齐全,仅需 …...

.gitignore 文件——如何在 Git 中忽略文件和文件夹详细教程

文章目录 什么是 .gitignore 文件&#xff1f;.gitignore 文件是用来做什么的&#xff1f;如何创建一个 .gitignore 文件&#xff1f;在 .gitignore 文件中应包括什么&#xff1f;如何在 Git 中忽略一个文件和文件夹如何忽略以前提交的文件 什么是 .gitignore 文件&#xff1f;…...

【数据结构(二)】单链表(3)

文章目录 1. 链表介绍2. 单链表应用实例2.1. 顺序添加方式2.1.1. 思路分析2.1.2. 代码实现 2.2. 按照编号顺序添加方式2.2.1. 思路分析2.2.2. 代码实现 3. 单链表节点的修改3.1. 思路分析3.2. 代码实现 4. 单链表节点的删除4.1. 思路分析4.2. 代码实现 5. 单链表常见面试题5.1.…...

创新案例|云服务平台HashiCorp是如何构建开源社区实现B2B增长飞轮

社区文化是HashiCorp企业文化的重要组成部分。虽然众多公司声称自己是社区驱动&#xff0c;但实际付诸行动的很少。与众不同的是&#xff0c;HashiCorp从一开始就将社区视为战略方针的核心&#xff0c;这也影响和塑造了公司今天的发展方向。社区不仅是执行策略之一&#xff0c;…...

2024年软件测试面试必看系列,看完去面试你会感谢我的!!

朋友圈点赞的测试用例 功能测试 1点赞后是否显示结果 2.点赞后是否可以取消; 3.点赞取消后是否可以重复点赞; 4.共同好友点赞后&#xff0c;是否有消息提醒; 5.非共同好友点赞后&#xff0c;是否有消息提醒; 6.点击点赞人昵称&#xff0c;是否可以跳转到他/她的主页; 7.自己能…...

01ctfer 文件上传

01ctfer 文件上传 启动靶场 访问该地址 代码审计 <?php header("Content-Type:text/html; charsetutf-8"); // 每5分钟会清除一次目录下上传的文件 require_once(pclzip.lib.php);if(!$_FILES){echo <!DOCTYPE html> <html lang"zh">…...

2.2 调用星火大模型的API

调用星火大模型的API 1 申请API调用权限&#xff1a;2 调用原生星火 API3 统一API调用方式 项目仓库地址&#xff1a;https://github.com/datawhalechina/llm-universe 讯飞星火认知大模型&#xff0c;由科大讯飞于2023年5月推出的中文大模型&#xff0c;也是国内大模型的代表…...

云原生是整个信息化行业的未来,一文彻底搞懂云原生

云原生这个词来自英语的Cloud Native的翻译&#xff0c;云原生是已经存多年在术语&#xff0c;真正开始获得关注的是在2015年到2016年。 这归因于这几年逐渐发布的Docker的兴起。 会有越来越多的企业和组织开始关注到它&#xff0c;并把他们的工作负载运行在云端的益处。无论是…...

【Redis】RedisTemplate最全的常用方法

文章目录 前言1.RedisTemplate常用方法2.String类型3.Hash类型4.List类型5.Set类型6.zSet类型 前言 RedisTemplate常用方法String类型Hash类型List类型Set类型zSet类型 Redis常用的数据类型&#xff1a;String、Hash、List、Set、zSet 1.RedisTemplate常用方法 redisTempla…...

图像倾斜角度求取-Radon变换

Radon算法 Radon&#xff08;拉东&#xff09;算法是一种通过定方向投影叠加&#xff0c;找到最大投影值时角度&#xff0c;从而确定图像倾斜角度的算法。具体过程如图所示 图1 Radon变换算法 Radon计算示例 对于纹理方向明显的图像&#xff0c;如图2所示&#xff0c;可以通…...

如何在本地搭建Oracle数据库实现公网环境下通过PLSQL工具进行远程访问

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle 前言 Oracle&#xff0c;是甲骨文公司的一款关系…...

时序预测 | Python实现ConvLSTM卷积长短期记忆神经网络股票价格预测(Conv1D-LSTM)

时序预测 | Python实现ConvLSTM卷积长短期记忆神经网络股票价格预测(Conv1D-LSTM) 目录 时序预测 | Python实现ConvLSTM卷积长短期记忆神经网络股票价格预测(Conv1D-LSTM)预测效果基本介绍程序设计参考资料预测效果 基本介绍 时序预测 | Python实现ConvLSTM卷积长短期记忆神…...

qtpdfium的编译及读取pdf文件和一些简单操作

qtpdfium是谷歌的一款开源项目&#xff0c;它的内核是基于国内的福昕pdf&#xff0c;许可协议为 BSD 3-Clause&#xff0c;允许用于闭源商业行为 下载 我们可以从git上进行下载&#xff0c;github&#xff0c;如果嫌下载速度慢&#xff0c;可以从csdn进行下载csdn 下载完成之…...

ClickHouse查看执行计划

在clickhouse 20.6版本之前要查看SQL语句的执行计划需要设置日志级别为trace才能可以看到&#xff0c;并且只能真正执行sql&#xff0c;在执行日志里面查看。在20.6版本引入了原生的执行计划的语法。在20.6.3版本成为正式版本的功能。 本文档基于目前较新稳定版21.7.3.14。 1.基…...

2023-11-17 VsCode使用makefile进行多文件编译

点击 <C 语言编程核心突破> 快速C语言入门 VsCode使用makefile进行多文件编译 前言一、一个简单的多文件示例二、makefile基本语法三、VsCode使用makefile总结 前言 要解决问题: C或C可以多文件编译, 意味着需要进行代码组织, 为了方便多文件编译, gnu开发了make工具, …...

Network(四)NAT实现方式与VRRP概述

一 NAT 1 NAT概述 &#xff08;1&#xff09;NAT的作用 Network Address Translation&#xff0c;网络地址转换 通过将内部网络的私有IP地址转换成全球唯一的公网IP地址使内部网络可以连接到互联网。 &#xff08;2&#xff09;私有IP地址分类 A类10.0.0.0~10.255.255.…...

C#_键盘钩子

一、class class KeyboardHook{public event KeyEventHandler KeyDownEvent;public event KeyPressEventHandler KeyPressEvent;public event KeyEventHandler KeyUpEvent;public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);static int hKeyboardHook 0;…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

elementUI点击浏览table所选行数据查看文档

项目场景&#xff1a; table按照要求特定的数据变成按钮可以点击 解决方案&#xff1a; <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...