2311rust,到60版本更新

1.54.0稳定版

属性可调用类似函数的宏

Rust1.54支持在属性中调用类似函数的宏.类似函数的宏是像基于macro_rules!宏一样调用的或像macro!(...)一样的过程宏.

注意,常见用例是,在Rust文档注解中包含其他文件中的文档.如,如果项目的README代表了一个很好的文档注释,则可用include_str!直接整合内容.

#![doc = include_str!("README.md")]

也可在属性中嵌套宏.如,可用用stringify!来包括替换的concat!宏来构建文档注释:

macro_rules! make_function {($name:ident, $value:expr) => {#[doc = concat!("The `", stringify!($name), "` example.")]/// #示例///```#[doc = concat!("assert_eq!(", module_path!(), "::", stringify!($name), "(), ",stringify!($value), ");")]///pub fn $name() -> i32 {$value}};
}
make_function! {func_name, 123}

更多.

稳定WASM32内部函数

已稳定wasm32平台的许多允许访问WebAssembly中的SIMD指令的内部函数.

即可按完全安全的函数公开一些内部函数,如v128_bitselect.但是,仍有一些内部函数不安全的,因为它们使用原始指针,如v128_load.

默认,重新启用增量编译

稳定的API

已稳定以下方法和特征实现.

BTreeMap::into_keys
BTreeMap::into_values
HashMap::into_keys
HashMap::into_values
arch::wasm32
VecDeque::binary_search
VecDeque::binary_search_by
VecDeque::binary_search_by_key
VecDeque::partition_point

1.55.0稳定版

Cargo删除重复数据编译器错误

过去版本中,运行cargo test,cargo check --all-targets或类似的命令时,在多个配置中构建了相同的Rust仓库,因为是并行运行rustc,可能会重复显示相同的错误和警告.

如,在1.54.0中,此输出很常见:

$ cargo +1.54.0 check --all-targetsChecking foo v0.1.0
warning: function is never used: `foo`--> src/lib.rs:9:4|
9 | fn foo() {}|    ^^^|= note: `#[warn(dead_code)]` on by default
warning: 1 warning emitted
warning: function is never used: `foo`--> src/lib.rs:9:4|
9 | fn foo() {}|    ^^^|= note: `#[warn(dead_code)]` on by default
warning: 1 warning emittedFinished dev [unoptimized + debuginfo] target(s) in 0.10s

1.55中,已调整为在编译结束删除重复数据再打印报告:

$ cargo +1.55.0 check --all-targetsChecking foo v0.1.0
warning: function is never used: `foo`--> src/lib.rs:9:4|
9 | fn foo() {}|    ^^^|= note: `#[warn(dead_code)]` on by default
warning: `foo` (lib) generated 1 warning
warning: `foo` (lib test) generated 1 warning (1 duplicate)Finished dev [unoptimized + debuginfo] target(s) in 0.84s

更快,更正确的浮点解析

已更新标准库的浮点解析实现为提高速度和正确性Eisel-Lemire算法,细节.

已更新std::io::ErrorKind变体

std::io::ErrorKind是一个可分类错误为如NotFoundWouldBlock等可移植分类的#[non_exhaustive]枚举.

std::io::ErrorRust代码可调用kind方法来取std::io::ErrorKind,并匹配该方法以处理指定错误.
并非所有错误都归类为ErrorKind值;在以前的Rust版本中,未分类的错误ErrorKind::Other;分类.
但是,用户创建的std::io::Error值也常用ErrorKind::Other.

1.55中,未分类的错误,现在使用内部变体ErrorKind::Uncategorized,并打算隐藏它,且不能用稳定的Rust代码命名;

这让ErrorKind::Other专门构造非标准库的std::io::Error值.这强制ErrorKind#[non_exhaustive]本质.

Rust代码永远不应与ErrorKind::Other匹配,并期望特定的底层错误码;仅当抓使用该错误类型的已构造std::io::Error时,才匹配ErrorKind::Other.
匹配std::io::ErrorRust代码应总是用_来表示未知错误类型,此时,可匹配底层错误码,或报告错误,或冒泡到调用代码.

此更改确保未知代码匹配变体,必须使用既适合ErrorKind::Uncategorized,也适合将来仅限nightly-only的变体的_抓所有模式.

添加了开区间模式

Rust1.55稳定了模式使用开区间:

match x as u32 {0 => println!("zero!"),1.. => println!("正数"),
}

细节.

稳定API

已稳定以下方法和特征实现.

Bound::cloned
Drain::as_str
IntoInnerError::into_error
IntoInnerError::into_parts
MaybeUninit::assume_init_mut
MaybeUninit::assume_init_ref
MaybeUninit::write
array::map
ops::ControlFlow
x86::_bittest
x86::_bittestandcomplement
x86::_bittestandreset
x86::_bittestandset
x86_64::_bittest64
x86_64::_bittestandcomplement64
x86_64::_bittestandreset64
x86_64::_bittestandset64

以下以前稳定的函数现在是.

str::from_utf8_unchecked

1.57.0稳定版

在常环境中用恐慌!

以前版本Rust,在const fn和其他编译时环境中不可用恐慌!宏.现在,已稳定下来.从而,其他几个标准库API现在都可在中使用,比如assert!.

现在必须用:

panic!("...")
//静态串
//或与{}搭配用的&str插值
panic!("{}", a)

该最小的稳定已支持直接编译时断定,如验证类型的大小:

const _: () = assert!(std::mem::size_of::<u64>() == 8);
const _: () = assert!(std::mem::size_of::<u8>() == 1);

Cargo自定义配置文件

Cargo长期以来,一直支持四种配置文件:dev,release,testbench.在Rust1.57中,支持任意命名配置文件.

如,如果只想在最终生产版本时,启用(LTO)链接时优化,则在选择此配置文件时,添加以下代码片Cargo.toml会启用lto标志,但避免普通发布版本启用它.

[profile.production]
inherits = "release"
lto = true

注意,自定义配置文件必须要继承的默认设置配置文件.定义配置文件后,构建时,可加上:

--profile production

目前,在单独的目录(在本例中为target/production)中构建,而不会在目录间共享.

易错分配

Rust1.57稳定了Vec,String,HashMap,HashSetVecDequetry_reserve.
如果全局分配器失败,Rust一般会中止进程,这并不总是可取的.此API在使用标准库集合时,可避免中止.

但是,Rust并不保证,由内核分配返回内存:如,如果在Linux上启用了过提交(overcommit),则试使用内存时,可能内存不可用.

稳定的API

已稳定以下方法和特征实现.

[T; N]::as_mut_slice
[T; N]::as_slice
collections::TryReserveError
HashMap::try_reserve
HashSet::try_reserve
String::try_reserve
String::try_reserve_exact
Vec::try_reserve
Vec::try_reserve_exact
VecDeque::try_reserve
VecDeque::try_reserve_exact
Iterator::map_while
iter::MapWhile
proc_macro::is_available
Command::get_program
Command::get_args
Command::get_envs
Command::get_current_dir
CommandArgs
CommandEnvs

以前稳定函数现在是.

hint::unreachable_unchecked

1.58.0稳定版

格式串中抓标识

格式串,现在只需在中写入{ident}即可抓参数.长期以来格式一直接受位置参数(可选按索引)和命名参数,如:

println!("Hello, {}!", get_person());                //隐式位置
println!("Hello, {0}!", get_person());               //显式索引
println!("Hello, {person}!", person = get_person()); //命名

现在,还可从周围的域命名参数,如:

let person = get_person();
//...抓局部的"人"
println!("Hello, {person}!"); //

也可格式化参数:

let (width, precision) = get_format();
for (name, score) in get_scores() {println!("{name}: {score:width$.precision$}");
}

格式串只能抓普通标识,而不能抓任意路径或表达式.对更复杂的参数,请先它们给局部名,或使用较旧的name=式风格来设置参数格式.

化简窗口命令搜索路径

窗口目标上,std::process::Command不再在当前目录中搜索可执行文件.这是win32CreateProcessAPI的遗留行为,因此Rust以下顺序有效搜索:
(相关Rust)子级的PATH环境变量中列举的目录(如果从父级显式更改该环境变量).
1,从加载应用的目录.
2,父进程的当前目录.
3,32窗口系统目录.
4,16窗口系统目录.
5,窗口目录.
6,在PATH环境变量中列举的目录.

窗口Rust新命令搜索顺序为:

1,子级的PATH环境变量中列举的目录.
2,从加载应用的目录.
3,32窗口系统目录.
4,窗口目录.
5,在PATH环境变量中列举的目录.

非窗口目标继续使用其相关平台行为,一般只考虑子或父PATH环境变量.

标准库中更多#[must_use]

类型或函数可应用#[must_use]属性,如果不显式考虑它们,输出就会出错.在标准库中,长期以来一直用Result等类型,应检查它们是否存在错误条件.
类似函数,但比真正语言功能更宽松.

稳定的API

Metadata::is_symlink
Path::is_symlink
{integer}::saturating_div
Option::unwrap_unchecked
Result::unwrap_unchecked
Result::unwrap_err_unchecked
File::options

常函数

Duration::new
Duration::checked_add
Duration::saturating_add
Duration::checked_sub
Duration::saturating_sub
Duration::checked_mul
Duration::saturating_mul
Duration::checked_div

1.58.1稳定版

Rust1.58.1修复了std::fs::remove_dir_all标准库函数中的竞争.
修复了Rustfmt中的通过标准输入时阻止格式化生成的文件.
修复了rustc有时显示的错误信息.

1.59.0稳定版

内联汇编

Rust语言现在支持内联汇编.这样,可执行非常低级控制,或访问专门的机器指令.
如,针对x86-64目标编译时,现在可编写:

use std::arch::asm;
//用`移位和加法`乘6
let mut x: u64 = 4;
unsafe {asm!("mov {tmp}, {x}","shl {tmp}, 1","shl {x}, 2","add {x}, {tmp}",x = inout(reg) x,tmp = out(reg) _,);
}
assert_eq!(x, 4 * 6);

asm!global_asm!宏中的格式串语法与Rust格式串中使用的相同.
内联汇编汇编语言和指令目标架构而异.目前,稳定的Rust编译器支持以下架构内联汇编:

x86 and x86-64
ARM
AArch64
RISC-V

更多内联汇编见示例.

解构赋值

现在,可用元组,切片和结构模式作为赋值左侧.

let (a, b, c, d, e);
(a, b) = (1, 2);
[c, .., d, _] = [1, 2, 3, 4, 5];
Struct { e, .. } = Struct { e: 5, f: 3 };
assert_eq!([1, 2, 1, 4, 5], [a, b, c, d, e]);

使得赋值let绑定更加一致,注意,禁止使用(如+=)符号解构赋值.

泛型默认值和交错

泛型类型,现在可为常量泛型指定默认值.如,现在可编写以下内容:

struct ArrayStorage<T, const N: usize = 2> {arr: [T; N],
}
impl<T> ArrayStorage<T> {fn new(a: T, b: T) -> ArrayStorage<T> {ArrayStorage {arr: [a, b],}}
}

以前,必须在所有参数前指定类型参数.已放宽该限制,现在可交错.

fn cartesian_product<T, const N: usize,U, const M: usize,V, F
>(a: [T; N], b: [U; M], f: F) -> [[V; N]; M]
whereF: FnMut(&T, &U) -> V
{//...
}

创建去掉的二进制文件

分发的二进制文件中去掉不必要的信息(如debuginfo)来使它们变小,一般很有用.
虽然,创建二进制文件后总是可手动这样,但cargorustc现在支持在链接二进制文件时去掉.要启用此功能,在Cargo.toml中加上:

[profile.release]
strip = "debuginfo"

更多细节

稳定的API

已稳定以下方法和特征实现:

std::thread::available_parallelism
Result::copied
Result::cloned
arch::asm!
arch::global_asm!
ops::ControlFlow::is_break
ops::ControlFlow::is_continue
TryFrom<char> for u8
char::TryFromCharError implementing Clone, Debug, Display, PartialEq, Copy, Eq, Error
iter::zip
NonZeroU8::is_power_of_two
NonZeroU16::is_power_of_two
NonZeroU32::is_power_of_two
NonZeroU64::is_power_of_two
NonZeroU128::is_power_of_two
DoubleEndedIterator for ToLowercase
DoubleEndedIterator for ToUppercase
TryFrom<&mut [T]> for [T; N]
UnwindSafe for Once
RefUnwindSafe for Once
armv8 neon intrinsics for aarch64

以下稳定函数现在是:

mem::MaybeUninit::as_ptr
mem::MaybeUninit::assume_init
mem::MaybeUninit::assume_init_ref
ffi::CStr::from_bytes_with_nul_unchecked

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

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

相关文章

对于可变参数的处理

可变参数&#xff1a;可变参数“...”根据前面参数的地址确定可变参的地址&#xff0c;所以可变参前面至少要有一个参数来确定可变参的地址&#xff1b;接口函数&#xff1a; #include <stdarg.h>void va_start(va_list ap, last); //申请空间&#xff0c;自动获取栈类型…

java--拼图游戏

1、了解拼图游戏基本功能&#xff1a; 拼图游戏内容由若干小图像块组成的&#xff0c;通过鼠标点击图像块上下左右移动&#xff0c;完成图像的拼凑。 2、拼图游戏交互界面设计与开发&#xff1a; 通过创建窗体类、菜单、中间面板和左右面板完成设计拼图的交互界面 &#xff…

0069【Edabit ★☆☆☆☆☆】【求一个数的N次方】To the Power of _____

0069【Edabit ★☆☆☆☆☆】【求一个数的N次方】To the Power of _____ logic loops math numbers Instructions Create a function that takes a base number and an exponent number and returns the calculation. Examples calculateExponent(5, 5) // 3125 calculateEx…

观察者模式的运用——消息队列

观察者模式是一种行为设计模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象&#xff0c;当主题对象发生变化时&#xff0c;会自动通知所有观察者对象。观察者模式广泛应用于事件处理、用户界面更新和异步消息传递等情境中。 …

ChatGPT之父被OpenAI解雇

首席技术官 Mira Murati 任命临时首席执行官领导 OpenAI&#xff1b;山姆阿尔特曼&#xff08;Sam Altman&#xff09;离开公司。 阿尔特曼先生的离职是在董事会经过深思熟虑的审查程序之后进行的&#xff0c;审查程序得出的结论是&#xff0c;他在与董事会的沟通中始终不坦诚…

java 实现串口通讯

1、引入依赖 <dependency><groupId>org.scream3r</groupId><artifactId>jssc</artifactId><version>2.8.0</version> </dependency>2、配置启动串口 Component public class ContextHolder implements ApplicationContextAw…

使用共享内存进行通信的代码和运行情况分析,共享内存的特点(拷贝次数,访问控制),加入命名管道进行通信的代码和运行情况分析

目录 示例代码 头文件(comm.hpp) log.hpp 基础版 -- 服务端 代码 运行情况 加入客户端 代码 运行情况 两端进行通信 客户端 代码 注意点 服务端 代码 两端运行情况 共享内存特点 拷贝次数少 管道的拷贝次数 共享内存的拷贝次数 没有访问控制 管道 共享…

神辅助 Cursor 编辑器,加入 GPT-4 让编码更轻松!

分类 互联网 在 ChatGPT 问世之前&#xff0c;我们的编码方式很多时候都是面向搜索引擎编码&#xff0c;需要不断地进行搜索&#xff0c;然后复制粘贴&#xff0c;俗称复制粘贴工程师。 但是&#xff0c;随着ChatGPT的出现&#xff0c;这一切将彻底改变。 ChatGPT 是一种基于…

AI工具合集

网站&#xff1a;未来百科 | 为发现全球优质AI工具产品而生 (6aiq.com) 如今&#xff0c;AI技术涉及到了很多领域&#xff0c;比如去水印、一键抠图、图像处理、AI图像生成等等。站长之家之前也分享过一些&#xff0c;但是在网上要搜索找到它们还是费一些功夫。 今天发现了一…

STM32 HAL库函数HAL_SPI_Receive_IT和HAL_SPI_Receive的区别

背景 前段时间开发一个按键板驱动&#xff0c;该板用的STM32F103系列单片机&#xff0c;前任工程师用STM32CubeMX生成的工程&#xff0c;里面全是HAL库调用&#xff0c;我接手后&#xff0c;学习了下HAL库的用法&#xff0c;踩坑不少&#xff0c;特别是带IT后缀的函数&#xf…

R语言实现多变量孟德尔随机化分析(1)

多变量孟德尔随机化分析调整了潜在混杂因素的影响。 1、调整哪些因素&#xff1f;参考以往文献。可以分别调整&#xff0c;也可以一起调整。 2、解决了什么问题&#xff1f;某个暴露相关的SNP&#xff0c;往往与某个或者某几个混杂因素相关。可以控制混杂偏倚。 3、如何解释…

AI从入门到精通,什么是LLMs大型语言模型?

大型语言模型是指由大量文本数据训练而成的自然语言处理模型&#xff0c;它可以生成高质量的文本内容&#xff0c;并能够理解和回答人类提出的问题。 这种模型通常基于深度学习技术&#xff0c;如循环神经网络&#xff08;RNN&#xff09;或变换器&#xff08;Transformer&…

【左程云算法全讲11】贪心算法 并查集

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于左程云算法课程进行的&#xff0c;每个知识点的修正和深入主要参考…

电子电器架构 —— 车载网关边缘节点总线转换

电子电器架构 —— 车载网关边缘节点路由转发策略 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 PS:小细节,本文字数3000+,详细描述了网关在车载框架中的具体性能设置。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无…

Java枚举

在Java中&#xff0c;枚举&#xff08;Enumeration&#xff09;是一种特殊的数据类型&#xff0c;用于表示一组常量。Java 5及以上版本引入了枚举类型&#xff08;Enum Type&#xff09;&#xff0c;通过关键字 enum 来定义。 以下是关于Java枚举的一些基本概念和用法&#xf…

Django(八、如何开启事务、介绍长见的字段类型和参数)

文章目录 ORM事务操作开启事务 常见的字段类型和参数ORM还支持用户自定义字段类型ORM常用字段参数外键相关参数 ORM事务操作 引入事务 1.事务的四大特性原子性、一致性、隔离性、持久性 2.相关SQL关键字start transaction;rollback;commit;savapoint; 3.相关重要概念脏读、幻…

系列十、你说你做过JVM调优和参数配置,请问如何盘点JVM系统的默认值?

一、JVM的参数类型 1.1、标配参数 java -versionjava -help 1.2、XX参数 1.2.1、Boolean类型 公式&#xff1a;-XX:或者- 某个属性值 表示开启、-表示关闭 # 是否打印GC收集细节 -XX:PrintGCDetails -XX:-PrintGCDetails# 是否使用串行垃圾收集器 -XX:UseSerialGC -XX:-UseS…

使用FFmpeg合并多个ts视频文件转为mp4格式

前言 爬取完视频发现都是ts文件&#xff0c;而且都是几百KB的视频片段&#xff0c;.ts 全名叫&#xff1a;MPEG Transport Stream&#xff0c;它是一个万能的多媒体容器&#xff0c;可以装下音频、视频、字幕。有时我们需要将.ts文件转换为其他更加广泛被支持的格式&#xff0…

springboot项目中没有识别到yml文件解决办法

springboot项目中没有识别到yml文件解决办法 ![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传] 1、这个意思就是没有配置数据库的数据源路径。所以需要配置数据源&#xff0c;比如mysql的驱动和路径。检查是否在properties或者yml文件中是否已经配置好。…

简单的用Python实现一下,采集某牙视频,多个视频翻页下载

前言 表弟自从学会了Python&#xff0c;每天一回家就搁那爬视频&#xff0c;不知道的以为是在学习&#xff0c;结果我昨天好奇看了一眼&#xff0c;好家伙&#xff0c;在那爬某牙舞蹈区&#xff0c;太过分了&#xff01; 为了防止表弟做坏事&#xff0c;我连忙找了个凳子坐下&…