2311rust,到35版本更新

1.32.0

rustup self update
rustup update stable

rustup更新自己.

dbg

打印调试,你需要:

let x = 5;
println!("{:?}", x);
//甚至可能是
println!("{:#?}", x);

Rust1.32.0中,为此添加了个新的dbg!宏:

fn main() {let x = 5;dbg!(x);
}

如果运行此程序,会看到:

[src/main.rs:4] x = 5

你获得了调用此文件的文件和行号,及名字和值.此外,println!打印到标准输出,所以要用eprintln!打印到标准错误.dbg!干活,然后在stderr输出.
看看阶乘示例:

fn factorial(n: u32) -> u32 {if n <= 1 {n} else {n * factorial(n - 1)}
}

如果想调试它,可用eprintln这样:

fn factorial(n: u32) -> u32 {eprintln!("n: {}", n);if n <= 1 {eprintln!("n <= 1");n} else {let n = n * factorial(n - 1);eprintln!("n: {}", n);n}
}

想在每次迭代时记录n,并为每个分支提供某种环境.查看factorial(4)的输出:

n: 4
n: 3
n: 2
n: 1
n <= 1
n: 2
n: 6
n: 24

使用dbg!

fn factorial(n: u32) -> u32 {if dbg!(n <= 1) {dbg!(1)} else {dbg!(n * factorial(n - 1))}
}

得到的输出:

[src/main.rs:3] n <= 1 = false
[src/main.rs:3] n <= 1 = false
[src/main.rs:3] n <= 1 = false
[src/main.rs:3] n <= 1 = true
[src/main.rs:4] 1 = 1
[src/main.rs:5] n * factorial(n - 1) = 2
[src/main.rs:5] n * factorial(n - 1) = 6
[src/main.rs:5] n * factorial(n - 1) = 24
[src/main.rs:11] factorial(4) = 24

因为dbg!宏返回正在调试的值,而不是eprintln!版的返回(),不能更改代码结构.

默认删除jemalloc

Rust1.28发布了可选择全局分配器的方法,就开始计划把默认分配器切换到系统分配器,并允许你通过crate使用jemalloc.在Rust1.32中,终于完成了这项工作,默认,你获得程序系统分配器.
如果想继续使用jemalloc,这里.在你的Cargo.toml中:

jemallocator = "0.1.8"

仓库根目录:

#[global_allocator]
static ALLOC: jemallocator::Jemalloc = jemallocator::Jemalloc;

就是这样!如果不需要jemalloc,不会强加给你,如果确实需要它,只需几行代码即可.

最终模块改进

现在叫"统一路径",它允许以前无效的导入路径语句按非导入路径完全相同方式解析.如:

enum Color { Red, Green, Blue }
use Color::*;

此代码以前未编译,因为use语句必须以super,selfcrate开头.现在编译器支持统一路径,此代码将起作用,并执行期望操作:导入use语句上方定义Color枚举的变体.

改进宏

首先,添加了新的字面匹配器,这里:

macro_rules! m {($lt:literal) => {};
}
fn main() {m!("some string literal");
}

字面与任意类型字面匹配:串字面,数字字面,符字面.
2018版中,也可用macro_rules宏如下用?:

macro_rules! bar {($(a)?) => {}
}

?匹配模式零次或一次重复,类似*/+.

稳定库

制作了19个函数const fn,且所有整数数值原语,现在都提供与字节数组间带指定字节序的转换函数.
六个函数分别叫to_<endian>_bytesfrom_<endian>_bytes,其中<endian>是以下函数之一:
ne-原生字节序
le-小端
be-大端

货物特点
Cargocargo ccargo check的别名,现在允许在注册URL中使用用户名.

1.33.0稳定版

改进const fn

现在,使用const fn可做更多:

const fn foo((x, y): (u8, u8)) { ... }
//析构模式.

1,let绑定与可变let绑定

let x = 1;//绑定
let mut x = 1;//可变绑定.

2,(如x=y)赋值赋值符号(如x+=y)式,即使赋值目标是投影(如结构字段或索引操作,如x[3]=42)
3,语句(如3;)

4,还可在const fn中如下调用const unsafe fn:

const unsafe fn foo() -> i32 { 5 }
const fn bar() -> i32 {unsafe { foo() }
}

固定

两类固定:std::pin::Pin<P>类型和Unpin标记特征.std::pin的核心思想:

有时,要保证对象不会移动,典型示例是构建自引用结构,移动指向自身指针的对象会使它们失效,从而导致未定义行为.

Pin<P>确保指针固定的.

_导入

现在可按_导入项目.允许导入特征的实现,且名字空间没有该名.如

use std::io::Read as _;
//允许,因为模块中只有一个"读取".
pub trait Read {}

稳定库

1,overflowing_{add,sub,mul,shl,shr}方法,现在是所有数值类型常量函数.
2,rotate_left,rotate_rightwrapping_{add,sub,mul,shl,shr}方法,现在是所有数值类型常量函数.
3,is_positiveis_negative方法现在是所有整数值类型的常量函数.
4,所有NonZero类型的get方法现在都是const.
5,count_ones,count_zeros,leading_zeros,trailing_zeros,swap_bytes,from_be,from_le,to_beto_le方法,现在对所有数值类型都是常量.
6,Ipv4Addr::new现在是const函数.

此外,这些API已稳定:
1,unix::FileExt::read_exact_atunix::FileExt::write_all_at.
2,Option::transposeResult::transpose
3,convert::identity
4,pin::Pinmarker::Unpin(如上)
5,marker::PhantomPinned
6,Vec::resize_withVecDeque::resize_with
7,持续时间::as_millis,持续时间::as_micros持续时间::as_nanos.

1.34.0稳定版

在此版本中,Cargo支持备用注册.它与crates.io共存,因此你可编写依赖于crates.io和自定义注册表中的crate的软件.
然而,crates.io上的仓库不能依赖外部注册.
要使用备用注册,必须添加如下行到.cargo/config中.可在(~/.cargo/config)你的主目录中,也可在相对包目录添加此文件.

[registries]
my-registry = { index = "https://my-intranet:8080/git/index" }

Cargo.toml中指定依赖项时,请用注册表项让Cargo知道想从备用注册表中取crate:

[dependencies]
other-crate = { version = "1.0", registry = "my-registry" }

作为crate作者,如果想把注册crate发布到备用表,首先要用cargo login命令,把认证令牌保存到~/.cargo/credentials中:

cargo login --registry=my-registry

然后,可用--registry标志指示发布时要使用的注册表:

cargo publish --registry=my-registry

文档测试中用?

RFC1937提议增加了对在fnmain(),#[test]函数和doctests中使用?符号的支持,允许它们返回Option<T>Result<T,E>,错误值会导致fn main()中的非零退出码,而在测试时会导致测试失败.

此版本中,在doctests完全支持?.现在,可在文档测试中编写以下内容:

/// ```rust
/// use std::io;
/// let mut input = String::new();
/// io::stdin().read_line(&mut input)?;
/// # Ok::<(), io::Error>(())
/// ```
fn my_func() {}

仍必须在文档测试底部,指定要使用的错误类型.

自定义属性接受任意令牌流

Rust过程宏可定义使用的自定义属性.目前,限制为根据指定语法的路径和字面树,如:

#[foo(bar)]
#[foo = "bar"]
#[foo = 0]
#[foo(bar = true)]
#[foo(bar, baz(quux, foo = "bar"))]

过程宏不同,这些助手属性不能接受分隔符中的任意令牌流,因此无法编写#[range(0..10)]#[bound(T:MyTrait)].过程宏crate改用串来指定此语法,如#[range("0..10")].

在该Rust版本中,#[attr($tokens)]自定义属性与一样,现在接受$tokens中的任意令牌流.

TryFromTryInto

允许易出错类型转换的TryFromTryInto特征已稳定.
如,整数类型的from_be_bytes和相关带数组方法,但数据一般通过切片读入.手动转换切片和数组很麻烦.有了新的特征,就可用.try_into()内联完成.

let num = u32::from_be_bytes(slice.try_into()?);

不会失败的转换(如u8u32),添加了Infallible类型.这样,允许对所有现有的From实现全面实现TryFrom.未来,可能想将Infallible变成!(从不)类型.

弃用FN before_exec,选择unsafe fn pre_exec

Unix类系统上,CommandExt::before_exec函数在调用exec之前,允许调度要运行的闭包.

提供的闭包分叉后的子进程环境中运行.即资源(如文件描述符和内存映射区域)可能会重复.即,现在可复制非Copy类型的值到其他进程中,同时在父进程保留原值.
这样就有可能导致未定义行为,并破坏了不重复的假设.

因此,应按不安全标记该before_exec函数.该版本的Rust中,弃用了fn before_exec,并使用unsafe fn pre_exec.
调用CommandExt::pre_exec时,由你确保闭包不会因无效使用这些重复项而违反库不变性.如果你提供的库与before_exec类似,请同样考虑弃用并提供不安全替代方法.

稳定库

1.34.0中,扩展了稳定的原子整数类型集,现在提供了从8位(AtomicU8)64位的有符号和正变体.
以前,(如NonZeroU8)非零正整数类型是稳定的.这使得Option<NonZeroU8>的大小与u8相同.在该Rust版本中,(如NonZeroI8)签名版本,已稳定下来.

iter::from_fniter::successors函数已稳定.前者允许从Fn Mut()->Option<T>构造迭代器.要从向量迭代弹出元素,现在可编写from_fn(||vec.pop()).
同时,后者创建了个每个连续项都根据前一项计算的新迭代器.
此外,这些API已稳定:

Any::type_id
Error::type_id
slice::sort_by_cached_key
str::escape_debug
str::escape_default
str::escape_unicode
str::split_ascii_whitespace
Instant::checked_add
Instant::checked_sub
SystemTime::checked_add
SystemTime::checked_sub

1.34.1稳定版修复

以下代码片中,期望方法需要dep:&D,但dep的实际类型是&&D:

dependencies.iter().filter(|dep| dep.required());

Clippy错误地建议了.filter(Dependency::required),因为借用的差异,编译器拒绝了.

clippy::missing_const_for_fn中的误报
修复了missing_const_for_fn棉绒中的另一个误报.此lint没有考虑到trait实现中的函数不能是const fn.如,给定以下代码片时,触发lint:

#[derive(PartialEq, Eq)] //警告:是一个`const_fn`
struct Point(isize, isize);
impl std::ops::Add for Point {type Output = Self;fn add(self, other: Self) -> Self { //警告:是一个`const_fn`Point(self.0 + other.0, self.1 + other.1)}
}

1.34.2稳定版

SeanMcArthur报告了个影响标准库的安全漏洞,该漏洞导致在手动实现Error::type_id方法返回错误的TypeId时,Error::downcast系列方法执行不合理的转换,从而导致越界读取/写入等安全问题.

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

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

相关文章

openGauss学习笔记-126 openGauss 数据库管理-设置账本数据库-归档账本数据库

文章目录 openGauss学习笔记-126 openGauss 数据库管理-设置账本数据库-归档账本数据库126.1 前提条件126.2 背景信息126.3 操作步骤 openGauss学习笔记-126 openGauss 数据库管理-设置账本数据库-归档账本数据库 126.1 前提条件 系统中需要有审计管理员或者具有审计管理员权…

数据中心走向绿色低碳,液冷存储舍我其谁

引言&#xff1a;没有最冷&#xff0c;只有更冷&#xff0c;绿色低碳早已成为行业关键词。 【全球存储观察 &#xff5c; 科技热点关注】 每一次存储行业的创新&#xff0c;其根源离不开行业端的用户需求驱动。 近些年从数据中心建设的整体发展情况来看&#xff0c;从风冷到…

【算法问题】错排问题

目录 1.概述2.代码实现2.1.获取错排情况总数2.2.获取每种错排情况 3.应用 1.概述 &#xff08;1&#xff09;n 个有序的元素有 n! 个不同的排列&#xff0c;如果一个排列使得所有的元素不在原来的位置上&#xff0c;则称这个排列为错排&#xff08;也称重排&#xff09;。例如…

Linux驱动开发 问题随笔

1、内核空间与用户空间数据交换方式 分两种情况&#xff1a; 1> 需要交换的数据量较大时&#xff1b; 2> 需要交换的数据量较小时&#xff1b; 第一种情况使用以下的函数&#xff1a; unsigned long copy_to_user(void __user* to, const void* from, unsigned long n)…

提升 Python 执行速度:Codon、C/C++、Rust、Numba(JIT)、Taichi、Nuitka、MatxScript

几种流行的 Python 性能加速方案对比&#xff1a;https://zhuanlan.zhihu.com/p/604519817 对于一般通用场景用户&#xff0c;对性能没有那么强烈的诉求&#xff0c;紧跟官方步伐&#xff0c;升级到最新版本的 Python 既可&#xff0c;或者使用 PyPy。Numba、Codon、Taichi 等这…

【蓝桥杯选拔赛真题23】C++计算24 第十二届蓝桥杯青少年创意编程大赛C++编程选拔赛真题解析

C/C++计算24 第十二届蓝桥杯青少年创意编程大赛C++选拔赛真题 一、题目要求 1、编程实现 “计算 24”是一个流传已久的数字游戏,小蓝最近对此痴迷不已 游戏规则是:从 1~10 之间的自然数任意拿出 4 个数(4 个数各不相同,顺序随机),进行加、减、乘三种运算(使用某种运算…

汇编-MOVSXD64位带符号扩展传送

允许源操作数为32位的寄存器或内存操作数 ExitProcess PROTO .code main PROCmov ebx, 0FFFFFFFFh movsxd rax, ebx ;RAX FFFFFFFFFFFFFFFFhmov ebx, 01FFFFFFFh movsxd rdx, ebx ;RDX 000000001FFFFFFFhmov ecx,0 ;结束程序call ExitProcess main ENDP E…

Spring学习之注解@Autowired、@Qualifier、@Resource

Spring学习之注解Autowired、Qualifier、Resource 在Spring框架中&#xff0c;注解&#xff08;Annotation&#xff09;是一种用于依赖注入&#xff08;DI&#xff09;的机制。 Autowired: Autowired 是Spring提供的注解&#xff0c;用于自动注入依赖。当Spring创建一个bean时…

【前端知识】Node——文件流的读写操作

四种基本流类型: 1.Writable: 可以向其写入数据的流 2.Readable: 可以从中读取数据的流 3.Duplex&#xff1a;同时为Readable 和 Writable 4.Transform: Duplex可以在写入和读取数据时修改或转换数据的流 一、Readable const fs require(fs);// 创建文件的Readable const rea…

ADB安装及使用介绍

一、ADB简介 1、什么是adb ADB 全称为 Android Debug Bridge&#xff0c;起到调试桥的作用&#xff0c;是一个客户端-服务器端程序。其中客户端是用来操作的电脑&#xff0c;服务端是 Android 设备。 ADB 也是 Android SDK 中的一个工具&#xff0c;可以直接操作管理 Android …

CRM系统的客户细分有什么作用?

我们常常说&#xff0c;企业想要开展有针对性的营销活动&#xff0c;就需要进行客户细分。通过特定条件&#xff0c;将客户分为几类&#xff0c;从而对不同类型的客户提供不同的产品和服务。下面我们就针对这里来详细说说&#xff0c;CRM中客户细分是什么&#xff1f;如何细分客…

微信小程序如何使用scss,less

搜到很多都是先VSCode安装好…插件…。这都是很久之前的方法了&#xff0c;所以想写这篇文章 一、修改project.config.json配置文件 "setting": {"useCompilerPlugins": ["sass"]},二、然后就可以删除 .wxss 文件了&#xff0c;就用 .scss 文件…

2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-A卷

2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-A卷 2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-A卷A模块基础设施设置/安全加固&#xff08;200分&#xff09;A-1&#xff1a;登录安全加固&#xff08;Windows, Linux&#xff09;A-2&#…

算法设计与分析算法实现——删数问题

通过棋盘输入一个高精度的正整数n(n的有效位数<=240)去掉其中任意s个数字后,剩下的数字按原左右次序将组成一个新的正整数。变成对给定的n和s,寻找一种方案,使得剩下的数字组成的新数最小。 输入:n,s 输出:最后剩下的最小数 输入实例: 178543 4 输出示例: 13 首先…

Java stream流 常用记录

根据列表中的某个字段进行去重 // 根据roleKey对列表去重return roleList.stream().map(AccountRole::getRoleKey).distinct().map(roleKey -> roleList.stream().filter(role -> role.getRoleKey().equals(roleKey)).findFirst().orElse(null)).filter(Objects::nonNul…

重建大师跑图瓦片失败,一般是什么原因?

答&#xff1a;一般是边缘瓦块失败比较多的情况会出现&#xff0c;其他一些正常瓦块失败&#xff0c;重新提交基本上也都可以解决。 重建大师是一款专为超大规模实景三维数据生产而设计的集群并行处理软件&#xff0c;输入倾斜照片&#xff0c;激光点云&#xff0c;POS信息及像…

为什么我学了 6 个月 Python,还是找不到工作?

在知乎上有一个特别火的问题&#xff1a; 为什么学了Python&#xff0c;我还是找不到工作&#xff1f; 有人说Python语言不行&#xff0c;有人说中国Python根本就没公司用。在大家群嘲的背后&#xff0c;我们来分析一下&#xff1a; 为什么大家都不看好Python&#xff1f; 学…

申请注册苹果iOS企业级开发者证书需要公司拥有什么规模条件

在全球范围内&#xff0c;iOS应用市场的规模和影响力不断增长&#xff0c;企业级应用在其中扮演着重要角色。为了在苹果设备上开发和发布内部应用&#xff0c;企业需要获取苹果的iOS企业级开发者证书。文章旨在探讨企业在申请此证书时需要满足的条件、注册流程&#xff0c;以及…