2311rust,到43版本更新

1.38.0

流水编译

要编译仓库,编译器不需要完全构建依赖项.相反,只需要它们的"元数据"(即类型,依赖关系,导出列表).
在编译过程的早期生成此元数据.从Rust1.38.0开始,Cargo利用这一点,在准备好元数据立即自动开始构建依赖的仓库.

检查错误使用mem::{uninitialized, zeroed}

尚未弃用mem::uninitialized;.但是,从1.38.0开始,rustc使用mem::uninitializedmem::zeroed检查一小类错误初化.

对某些(如&TBox<T>)类型,包含全0位模式是未定义行为.
因此,使用mem::uninitializedmem::zeroed初化这些类型之一是错误的,使用其中一个函数初化时,无论是直接还是按较大结构成员初化,新检查器都会发出警告.

检查递归的,因此以下代码发出警告:

struct Wrap<T>(T);
struct Outer(Wrap<Wrap<Wrap<Box<i32>>>>);
struct CannotBeZero {outer: Outer,foo: i32,bar: f32
}
...
let bad_value: CannotBeZero = unsafe { std::mem::uninitialized() };

Rust有更多不能为零的类型,特别是NonNull<T>NonZero<T>.目前,不检查使用mem::uninitializedmem::zeroed初化这些结构.

检查并不涵盖所有不合理使用mem::uninitializedmem::zeroed的情况,只是帮助识别绝对错误的代码.仍应移动所有代码以改用MaybeUninit.

#[deprecated]

现在可用弃用宏弃用

std::any::type_name

调试,取类型名有时很有用.如,在泛型代码中,想在运行时查看函数已实例化类型参数的具体类型.现在可用std::any::type_name完成此操作:

fn gen_value<T: Default>() -> T {println!("初化了实例{}", std::any::type_name::<T>());Default::default()
}
fn main() {let _: i32 = gen_value();let _: String = gen_value();
}

这打印:

初化`i32`的实例
初化`alloc::string::String`的实例

更改库

1,现在除了&T之外,slice::{concat,connect,join}还接受&[T].
2,*const T*mut T现在实现了marker::Unpin.
3,Arc<[T]>Rc<[T]>现在实现了FromIterator<T>.
4,iter::{StepBy,Peekable,Take}现在实现了DoubleEndedIterator.

此外,已稳定下来这些功能:
1,<*const T>::cast<*mut T>::cast
2,持续时间(Duration)::as_secs_f32持续时间::as_secs_f64
3,持续时间::div_f32持续时间::div_f64
4,持续时间::from_secs_f32持续时间::from_secs_f64
5,持续时间::mul_f32持续时间::mul_f64
6,余数和除法运算,对所有整数原语div_euclid,rem_euclid.还提供检查,溢出和包装版本.

1.39.0稳定版

.await结束了,async fn在此

Rust1.39.0中,很高兴地宣布async/.await已稳定!即,可定义异步函数和块,并.await它们.
可通过编写async fn而不是fn来引入异步函数,只是调用时返回Future.该Future是个暂停计算,可通过.await它来完成它.此外,

async fn
async { ... }
async move { ... }

可定义异步字面.
另见这里.

对匹配警卫中按移动绑定的引用

Rust中匹配模式时,可如下绑定变量:
1,按引用,可是不变,也可是可变的.可显式,如通过ref my_varref mutmy_var.不过,一般,可自动推导绑定模式.
2,按值或按复制(绑定变量类型实现Copy时)或按移动.

以前在匹配式if守卫中,Rust会禁止按移动绑定共享引用.即会拒绝以下代码:

fn main() {let array: Box<[u8; 4]> = Box::new([1, 2, 3, 4]);match array {nums
//`----'nums'`按移动绑定if nums.iter().sum::<u8>() == 10
//`------'.iter()'`隐式取`'nums'`引用.=> {drop(nums);
//`-----------'nums'`按移动绑定,所以有所有权.}_ => unreachable!(),}
}

Rust1.39.0中,编译器现在接受了上面的代码片.

函数参数的属性

Rust1.39.0中,现在允许在函数,闭包和函数指针的参数上添加属性.在此之前,可能已写过:

#[cfg(windows)]
fn len(slice: &[u16]) -> usize {slice.len()
}
#[cfg(not(windows))] 
fn len(slice: &[u8]) -> usize {slice.len()
}

…你现在可更简洁地写:

fn len(#[cfg(windows)] slice: &[u16], //在`Windows`上使用此参数.在其他地方,使用下面.#[cfg(not(windows))] slice: &[u8], //
) -> usize {slice.len()
}

可在此位置使用的属性包括:
1,条件编译:cfgcfg_attr
2,控制检查:允许,警告,拒绝和禁止
3,应用至项的过程宏属性使用的助手属性.

借用检查器(略).
标准库中的更多常量函数
Rust1.39.0中,以下函数变成了const fn:
1,Vec::new,String::newLinkedList::new
2,str::len,[T]::lenstr::as_bytes
3,ABS,wrapping_absoverflowing_abs

标准库的新增内容

以下函数已稳定下来:
1,Pin::into_inner
2,Instant::checked_duration_sinceInstant::saturating_duration_since

1.40.0稳定版

#[non_exhaustive]结构,枚举和变体

附加结构或枚举变体时,#[non_exhaustive]属性,阻止定义它的仓库外部的代码,构造所述结构或变体.为了避免未来破坏,其他仓库也无法在字段上完全匹配.

以下示例说明了beta中依赖于alpha的错误:

//`alpha/lib.rs:`
#[non_exhaustive]
struct Foo {pub a: bool,
}
enum Bar {#[non_exhaustive]Variant { b: u8 }
}
fn make_foo() -> Foo { ... }
fn make_bar() -> Bar { ... }//beta/lib.rs:
let x = Foo { a: true }; //~ 错误
let Foo { a } = make_foo(); //~ 错误// 添加更多字段,`beta`仍编译
let Foo { a, .. } = make_foo(); //~ OKlet x = Bar::Variant { b: 42 }; //~ 错误
let Bar::Variant { b } = make_bar(); //~ 错误
let Bar::Variant { b, .. } = make_bar(); //~ 好
//仍编译.

背后是,对#[non_exhaustive]版的结构或枚举变体,构造器的可见性被降级到pub(crate),从而阻止在定义它的仓库之外访问它.

#[non_exhaustive]的一个更重要方面是它也可附加枚举自身.如标准库中取的Ordering:

#[non_exhaustive]
pub enum Ordering { Relaxed, Release, Acquire, AcqRel, SeqCst }

这里,#[non_exhaustive]确保未来可添加更多变体.编译器拒绝:

match ordering {//如果添加了新的变体,这是个错误,这在编译器升级时会突然中断.Relaxed | Release | Acquire | AcqRel | SeqCst => {/*逻辑*/}
}

而,其他仓库需要用如_添加通配符分支来考虑更多变体:

match ordering {Relaxed | Release | Acquire | AcqRel | SeqCst => { /*`...`*/ }//好;如果添加更多变体,就不会破坏._ => { /*逻辑*/ }
}

改进宏和属性

包括:
1,在类型环境中,调用mac!()过程宏.
如,你可编写:

type Foo = expand_to_type!(bar);
//expand_to_type是过程宏.

2,extern{...}块中的宏.
包括bang!()宏,如:

macro_rules! make_item { ($name:ident) => { fn $name(); } }
extern {make_item!(alpha);make_item!(beta);
}

3,现在还支持extern{...}块中项的过程宏属性:

extern "C" {//假设扩展为`'fn foo();'`.#[my_identity_macro]fn foo();
}

4,产生macro_rules!过程宏中的项.
类似(mac!())的函数和(#[mac])属性宏,现在都可生成macro_rules!项目.

5,$m:meta匹配器支持任意令牌流值.
即,以下内容现在有效:

macro_rules! accept_meta { ($m:meta) => {} }
accept_meta!( my::path );
accept_meta!( my::path = "lit" );
accept_meta!( my::path ( a b c ) );
accept_meta!( my::path [ a b c ] );
accept_meta!( my::path { a b c } );

标准库中的更多常量函数
Rust1.40.0中,以下函数变成了const fn:
1,正整数版的is_power_of_two.

标准库的新增内容

Rust1.40.0中,稳定了以下函数和宏:
1,todo!()
unimplemented!()更短,更可读,更方便的版本.
2,slice::重复(repeat)
通过n重复切片来创建Vec<T>.
3,mem::take
此函数可变引用中取值,并用类型默认值替换它.类似Option::takeCell::take,并为mem::replace(&mut dst,Default::default())提供了一个方便的简写.
4,BTreeMap::get_key_valueHashMap::get_key_value
返回与提供的对应的键值对.

5,可选(Option)::as_deref,可选::as_deref_mut
类似Option::as_refOption::as_mut,但也分别使用DerefDerefMut,因此opt_box.as_deref()opt_box.as_deref_mut(),其中opt_box:Option<Box<T>>分别生成Option<&T>Option<&mut;T>.

6,可选::flatten

此函数把Option<Option<T>>变平为Option<T>,对Some(Some(x))变平为Some(x),否则为None.该函数类似Iterator::flatten.

7,UdpSocket::peer_addr

返回此套接字连接到的远端套接字地址.
8,{f32,f64}::to_be_bytes,{f32,f64}::to_le_bytes,{f32,f64}::to_ne_bytes,{f32,f64}::from_be_bytes,{f32,f64}::from_le_bytes{f32,f64}::from_ne_bytes

big-endian(network),little-endiannative-endian字节序排列,并按字节数组返回浮点数的内存表示.

1.41.0稳定版

放宽实现特征的限制

Rust1.41.0之前,孤儿规则过于严格,妨碍了组合.如,假设你的仓库定义了BetterVec<T>结构,且想要转换结构为标准库的Vec<T>.
要写的代码是:

impl<T> From<BetterVec<T>> for Vec<T> {//`...`
}

是如下模式的一个实例:

impl<T> ForeignTrait<LocalType> for ForeignType<T> {//`...`
}

Rust1.40.0中,孤立规则会禁止该impl,因为FromVec都是在标准库中定义的,这与当前的仓库无关.
有些方法如新类型模式,可绕过这些限制,但它们一般很麻烦.

虽然FromVec仍是外部的,但特征(本例为From)是由局部类型参数化的.因此,Rust1.41.0允许该实现.

过时时,cargo install更新安装包

Rust1.41.0开始,如果自安装以来发布了新版本,cargo install也会更新现有安装的仓库版本.此版之前,必须传递即使二进制仓库是最新的,也会重装的--force标志.

不易冲突的Cargo.lock格式

Rust1.41.0为文件引入了新的格式

FFI中使用Box<T>时的更多保证

Rust1.41.0开始,声明T:SizedBox<T>现在与C语言(T*)指针类型兼容.

因此,如果有从C调用的extern"C"Rust函数,你的Rust函数现在对特定T,可指定Box<T>,同时对相应函数,用C语言中的T*.
如,在C端,可能有:

//C头文件,返回所有权给调用者.
struct Foo* foo_new(void);
//从调用者取所有权;使用`NULL`调用时为`空操作`.
void foo_delete(struct Foo*);

而在Rust方面,你:

#[repr(C)]
pub struct Foo;
#[no_mangle]
pub extern "C" fn foo_new() -> Box<Foo> {Box::new(Foo)
}
//用`"Option<_>"`表示`NULL`的可能性.
#[no_mangle]
pub extern "C" fn foo_delete(_: Option<Box<Foo>>) {}

但注意,虽然Box<T>T*有相同的表示和ABI,但Box<T>仍必须为非空,对齐且准备好由全局分配器释放.为此,最好只使用全局分配器的Box.

更改库

Rust1.41.0中,标准库补充:
1,Result::map_orResult::map_or_else方法已稳定.
2,与Option::map_orOption::map_or_else类似,

.map(|val| process(val)).unwrap_or(default)

是上面的快捷方式.

3,(如果是较小整数宽度)NonZero*数值现在实现From<NonZero*>.如,NonZeroU16现在实现From<NonZeroU8>.
4,弱针上的weak_countstrong_count方法已稳定.

std::rc::Weak::weak_count
std::rc::Weak::strong_count
std::sync::Weak::weak_count
std::sync::Weak::strong_count

这些方法分别返回分配的弱(rc::Weak<T>sync::Weak<T>)或强(Rc<T>Arc<T>)指针数.
MaybeUninit<T>现在实现了fmt::Debug.

Rust1.41.0中,因为静态值内部表示有些变化,借用检查器意外地允许了一些不健全的程序.即,借用检查器不会检查静态项是否有正确类型.
这反之又允许分配生命期小于"静态"临时变量给静态变量:

static mut MY_STATIC: &'static u8 = &0;
fn main() {let my_temporary = 42;unsafe {//在`1.41.0`中错误地允许了:MY_STATIC = &my_temporary;}
}

此问题已在1.41.1中得到解决.

复制实现中遵守"静态生命期"

Rust1.0开始,一直编译以下错误程序:

#[derive(Clone)]
struct Foo<'a>(&'a u32);
impl Copy for Foo<'static> {}
fn main() {let temporary = 2;let foo = (Foo(&temporary),);drop(foo.0); //必须访问`"foo"`的一部分.drop(foo.0); //也可以`索引数组`.
}

Rust1.41.1中,已修复此问题.

错误原因是对某些'a,Foo<'a>仅在'a:'static时实现Copy.但是,带'0生命期的临时变量不会超过'static'存活,因此Foo<'0>不是Copy,因此第二次使用drop应该是个错误.

1.42.0稳定版

选项结果恐慌消息中的有用行号

unwrap_err,expect,及expect_err和相应Result类型函数,
所有这八个函数都会生成带行号的恐慌消息.新的错误消息如下:

 `"main"`线程,在`"None"`值上"调用`'Option::unwrap()'`时恐慌`',src/main.rs:2:5`

即在src/main.rs的第2行无效调用unwrap.

子切片模式

允许在切片上匹配.像这样:

fn foo(words: &[&str]) {match words {[] => println!("empty slice!"),[one] => println!("one element: {:?}", one),[one, two] => println!("two elements: {:?} {:?}", one, two),_ => println!("多少元素?"),}
}

虽允许在切片上匹配,但相当有限.必须选择想支持的确切尺寸,且要加分支.
Rust1.42中,扩展支持切片部分匹配,这里:

fn foo(words: &[&str]) {match words {["Hello", "World", "!", ..] => println!("Hello World!"),["Foo", "Bar", ..] => println!("Baz"),rest => println!("{:?}", rest),}
}

因为与切片的其余部分匹配,..叫"其余模式".上例在切片末尾使用其余模式,但也可按其他方式用它:

fn foo(words: &[&str]) {match words {//最后元素必须是`"!"`,忽略其他元素.[.., "!"] => println!("!!!"),//最后元素必须是`"z"`,`"start"`是除最后元素之外的`所有元素`的切片.[start @ .., "z"] => println!("starts with: {:?}", start),//第一个元素必须是`"a"`,`"end"`是除第一个元素之外的`所有元素`的切片.["a", end @ ..] => println!("ends with: {:?}", end),rest => println!("{:?}", rest),}
}

更多

matches!

稳定了一个新的matches!宏.此宏接受式及模式,如果模式与式匹配,则返回true.即:

//使用匹配式:
match self.partial_cmp(other) {Some(Less) => true,_ => false,
}
//使用`'matches!'`宏:
matches!(self.partial_cmp(other), Some(Less))

还可用|模式和if防护:

let foo = 'f';
assert!(matches!(foo, 'A'..='Z' | 'a'..='z'));
let bar = Some(4);
assert!(matches!(bar, Some(x) if x > 2));

现在可使用proc_macro::TokenStream;

Rust2018中,删除了extern crate的需求.但是过程宏有点特殊,要写过程宏时,仍需要

extern crate proc_macro;

此版本中,如果使用Cargo,则在使用2018版时不再需要此行;可像使用其他仓库一样使用.

1,iter::Empty<T>现在对T实现发送和同步.
2,Pin::{map_unchecked,map_unchecked_mut}不再需要返回类型实现Sized.
3,io::Cursor现在实现了PartialEqEq.
4,Layout::new现在是const.

稳定的API

1,CondVar::wait_whileCondVar::wait_timeout_while
2,DebugMap::keyDebugMap::value
3,ManuallyDrop::take
4,PTR::slice_from_raw_parts_mutPTR::slice_from_raw_parts

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

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

相关文章

【灾备】灾难恢复

文章目录 概述灾备指标虚拟化恢复灾难恢复计划四种方式灾难恢复相关技术来源 概述 灾难恢复&#xff08;Disaster recovery&#xff0c;也称灾备&#xff09;&#xff0c;指自然或人为灾害后&#xff0c;重新启用信息系统的数据、硬件及软体设备&#xff0c;恢复正常商业运作的…

Matlab通信仿真系列——图形处理函数

微信公众号上线&#xff0c;搜索公众号小灰灰的FPGA,关注可获取相关源码&#xff0c;定期更新有关FPGA的项目以及开源项目源码&#xff0c;包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 本节目录 一、plot函数 (1)绘制一…

振弦式渗压计与振弦采集仪组成大坝水库安全监测的案例

振弦式渗压计与振弦采集仪组成大坝水库安全监测的案例 振弦式渗压计是一种常用的水文地质监测仪器&#xff0c;主要用于测量土体中的渗流压力、水位变化等参数。而振弦采集仪则是一种数据采集和传输装置&#xff0c;可以将振弦式渗压计采集到的数据进行处理和传输。 在大坝水库…

以makefile的方式在linux上编译代码(小白级别)

作者&#xff1a;爱塔居 作者简介&#xff1a;大四学生&#xff0c;分享自己的学习片段~ 目录 前言 一、创建主要文件 二、makefile 前言 多有不足&#xff0c;以供参考&#xff0c;欢迎大佬们指点。我是在虚拟机上执行的&#xff0c;应该都一样。我用的VirtualBox&#xff0c;…

【18年扬大真题】定义一个Point类,要求如下所述。(1)用构造函数初始化Point类的对象(2)定义函数Distance,计算平面上两点之间的距离

【18年扬大真题】定义一个Point类&#xff0c;要求如下所述。 &#xff08;1&#xff09;用构造函数初始化Point类的对象 &#xff08;2&#xff09;定义函数Distance&#xff0c;计算平面上两点之间的距离 #include<stdio.h> #include<math.h> typedef struct {d…

Proxmox download

Proxmox VE proxmox Virtual Environment是一个基于 QEMU/KVM 和 LXC 的开源服务器虚拟化管理解决方案。您可以使用集成的、易于使用的 Web 界面或通过 CLI 管理虚拟机、容器、高可用性集群、存储和网络。Proxmox VE 代码根据 GNU Affero 通用公共许可证第 3 版获得许可 Prox…

LeetCode7-整数反转

需要判断整数溢出,我这里的思路就是判断新的ans的值是否与(ans-mod)/10相等,如果溢出了,必然不相等,这是代码简洁且时间复杂度最快的做法! class Solution {public int reverse(int x) {if(x0){return 0;}boolean negativefalse;if(x<0){negativetrue;x-x;}int ans0;while(…

使用SpringBoot Actuator监控应用

使用SpringBootActuator监控应用 微服务的特点决定了功能模块的部署是分布式的&#xff0c;大部分功能模块都是运行在不同的机器上&#xff0c;彼此通过服务调用进 行交互&#xff0c;前后台的业务流会经过很多个微服务的处理和传递&#xff0c;出现了异常如何快速定位是哪个…

Python大数据之linux学习总结——day11_ZooKeeper

ZooKeeper ZK概述 ZooKeeper概念: Zookeeper是一个分布式协调服务的开源框架。本质上是一个分布式的小文件存储系统 ZooKeeper作用: 主要用来解决分布式集群中应用系统的一致性问题。 ZooKeeper结构: 采用树形层次结构&#xff0c;ZooKeeper树中的每个节点被称为—Znode。且树…

Python scipy.spatial.distance.squareform() 函数的用法

scipy.spatial.distance.squareform 调用方法注意示例1 调用方法 from scipy.spatial.distance import pdist, squareformscipy.spatial.distance.squareform(X, forceno, checksTrue)各个参数意义&#xff1a; X&#xff1a;一个压缩或冗余的距离矩阵。 force&#xff1a;可以…

万字解析设计模式之 适配器模式

一、 适配器模式 1.1概述 将一个接口转换成客户希望的另一个接口&#xff0c;适配器模式使接口不兼容的那些类可以一起工作。 适配器模式分为类适配器模式和对象适配器模式&#xff0c;前者类之间的耦合度比后者高&#xff0c;且要求程序员了解现有组件库中的相关组件的内部结…

spring面试题合集介绍

订阅本合集&#xff0c;您将学习到一下内容&#xff1a; 一、Spring Framework 1.谈谈你对Spring的理解 2.Spring的优缺点是什么&#xff1f; 二、Spring IOC 3.什么是Spring IOC 容器&#xff1f;有什么作用&#xff1f; 4.Spring IoC 的实现机制是什么&#xff1f; 5.什么…

目标分割技术-语义分割总览

前言 博主现任高级人工智能工程师&#xff0c;曾发表多篇SCI且获得过多次国际竞赛奖项&#xff0c;理解各类模型原理以及每种模型的建模流程和各类题目分析方法。目的就是为了让零基础快速使用各类代码模型&#xff0c;每一篇文章都包含实战项目以及可运行代码。欢迎大家订阅一…

2023年度注册电气工程师(供配电)执业资格考试专业考试规范及设计手册

一&#xff0e;规程、规范&#xff1a; 1&#xff0e;《防止静电事故通用导则》GB 12158-2006&#xff1b; 2&#xff0e;《电能质量 供电电压偏差》GB/T 12325-2008&#xff1b; 3&#xff0e;《电能质量 电压波动和闪变》GB/T 12326-2008&#xff1b; 4&#xff0e;《电流…

录制第一个jmeter性能测试脚本2(http协议)——webtour

我们手工编写了一个测试计划&#xff0c;现在我们通过录制的方式来实现那个测试计划。也就是说‘’测试计划目标和上一节类似&#xff1a;让5个用户在2s内登录webtour&#xff0c;然后进入 页面进行查看。 目录 欢迎访问我的免费课程 PPT、安装包、视频应有尽有&#xff01; …

C#类有析构函数吗

在C#中&#xff0c;类不具有析构函数(destructor)的概念&#xff0c;而是有一种叫做终结器(finalizer)的东西&#xff0c;这在某种程度上和C的析构函数相似。终结器在对象不再需要时由垃圾收集器自动调用&#xff0c;用于释放非托管资源。在C#中&#xff0c;你不能直接调用终结…

leetcode:交叉链表

题目描述 题目链接&#xff1a;160. 相交链表 - 力扣&#xff08;LeetCode&#xff09; 题目分析 我们先要搞清楚一个概念&#xff0c;单链表可以相交&#xff0c;但绝对不会交叉 原因如下&#xff1a; 单链表中&#xff0c;多个结点可以存一个结点的地址&#xff0c;但是一…

【算法挨揍日记】day22——面试题 17.16. 按摩师、213. 打家劫舍 II

面试题 17.16. 按摩师 面试题 17.16. 按摩师 题目描述&#xff1a; 一个有名的按摩师会收到源源不断的预约请求&#xff0c;每个预约都可以选择接或不接。在每次预约服务之间要有休息时间&#xff0c;因此她不能接受相邻的预约。给定一个预约请求序列&#xff0c;替按摩师找…

国产高云FPGA:纯verilog实现视频图像缩放,提供6套Gowin工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐国产高云FPGA相关方案推荐国产高云FPGA基础教程 3、设计思路框架视频源选择OV5640摄像头配置及采集动态彩条跨时钟FIFO图像缩放模块详解设计框图代码框图2种插值算法的整合与选择 Video Frame Buffer 图像缓存DDR3 Memory Interface 4、Go…

Qml使用cpp文件的信号槽

文章目录 一、C文件Demo二、使用步骤1. 初始化C文件和QML文件&#xff0c;并建立信号槽2.在qml中调用 一、C文件Demo Q_INVOKABLE是一个Qt元对象系统中的宏&#xff0c;用于将C函数暴露给QML引擎。具体来说&#xff0c;它使得在QML代码中可以直接调用C类中被标记为Q_INVOKABLE的…