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,NonZeroU128
和NonZeroUsize
正整数类型的包装器.
这允许大小优化,如,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();}
}
在此,调用了100
次do_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
此外,现在可比较&str
和OsString
.
除此外,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
相互转换Pet
与JSON
,因为serde_derive
过程宏中定义了Serialize
和Deserialize
.
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-json
的json
宏,过去这样:
#[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
错误,且像syn
和quote
等仓库已在使用它们.如,之前:
#[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图像处理舞台上的巅峰对决
前言 在数字化时代,图像处理技术已经成为科技和计算机领域中不可或缺的一部分。从医学影像到计算机视觉,图像处理为我们提供了无限的可能性。Python作为一种灵活而强大的编程语言,在图像处理领域表现出色,拥有丰富的库和工具。本…...

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

YOLOv8 加持 MobileNetv3,目标检测新篇章
🗝️YOLOv8实战宝典--星级指南:从入门到精通,您不可错过的技巧 -- 聚焦于YOLO的 最新版本, 对颈部网络改进、添加局部注意力、增加检测头部,实测涨点 💡 深入浅出YOLOv8:我的专业笔记与技术总结 -- YOLOv8轻松上手, 适用技术小白,文章代码齐全,仅需 …...
.gitignore 文件——如何在 Git 中忽略文件和文件夹详细教程
文章目录 什么是 .gitignore 文件?.gitignore 文件是用来做什么的?如何创建一个 .gitignore 文件?在 .gitignore 文件中应包括什么?如何在 Git 中忽略一个文件和文件夹如何忽略以前提交的文件 什么是 .gitignore 文件?…...

【数据结构(二)】单链表(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企业文化的重要组成部分。虽然众多公司声称自己是社区驱动,但实际付诸行动的很少。与众不同的是,HashiCorp从一开始就将社区视为战略方针的核心,这也影响和塑造了公司今天的发展方向。社区不仅是执行策略之一,…...

2024年软件测试面试必看系列,看完去面试你会感谢我的!!
朋友圈点赞的测试用例 功能测试 1点赞后是否显示结果 2.点赞后是否可以取消; 3.点赞取消后是否可以重复点赞; 4.共同好友点赞后,是否有消息提醒; 5.非共同好友点赞后,是否有消息提醒; 6.点击点赞人昵称,是否可以跳转到他/她的主页; 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调用权限:2 调用原生星火 API3 统一API调用方式 项目仓库地址:https://github.com/datawhalechina/llm-universe 讯飞星火认知大模型,由科大讯飞于2023年5月推出的中文大模型,也是国内大模型的代表…...
云原生是整个信息化行业的未来,一文彻底搞懂云原生
云原生这个词来自英语的Cloud Native的翻译,云原生是已经存多年在术语,真正开始获得关注的是在2015年到2016年。 这归因于这几年逐渐发布的Docker的兴起。 会有越来越多的企业和组织开始关注到它,并把他们的工作负载运行在云端的益处。无论是…...
【Redis】RedisTemplate最全的常用方法
文章目录 前言1.RedisTemplate常用方法2.String类型3.Hash类型4.List类型5.Set类型6.zSet类型 前言 RedisTemplate常用方法String类型Hash类型List类型Set类型zSet类型 Redis常用的数据类型:String、Hash、List、Set、zSet 1.RedisTemplate常用方法 redisTempla…...

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

如何在本地搭建Oracle数据库实现公网环境下通过PLSQL工具进行远程访问
文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle 前言 Oracle,是甲骨文公司的一款关系…...

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

qtpdfium的编译及读取pdf文件和一些简单操作
qtpdfium是谷歌的一款开源项目,它的内核是基于国内的福昕pdf,许可协议为 BSD 3-Clause,允许用于闭源商业行为 下载 我们可以从git上进行下载,github,如果嫌下载速度慢,可以从csdn进行下载csdn 下载完成之…...
ClickHouse查看执行计划
在clickhouse 20.6版本之前要查看SQL语句的执行计划需要设置日志级别为trace才能可以看到,并且只能真正执行sql,在执行日志里面查看。在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概述 (1)NAT的作用 Network Address Translation,网络地址转换 通过将内部网络的私有IP地址转换成全球唯一的公网IP地址使内部网络可以连接到互联网。 (2)私有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;…...

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...