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
是一个可分类错误
为如NotFound
或WouldBlock
等可移植分类的#[non_exhaustive]
枚举.
有std::io::Error
的Rust
代码可调用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::Error
的Rust
代码应总是用_
来表示未知错误类型
,此时,可匹配
底层错误码,或报告
错误,或冒泡
到调用代码.
此更改确保未知代码
匹配变体,必须使用既适合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,test
和bench
.在Rust1.57
中,支持任意命名
的配置文件
.
如,如果只想在最终生产版本
时,启用(LTO)
链接时优化,则在选择此配置文件
时,添加以下代码片
到Cargo.toml
会启用lto
标志,但避免普通发布
版本启用它.
[profile.production]
inherits = "release"
lto = true
注意,自定义
配置文件必须要继承的默认设置
的配置文件
.定义配置文件
后,构建时,可加上:
--profile production
目前,在单独的目录(在本例中为target/production
)中构建
,而不会在目录
间共享.
易错分配
Rust1.57
稳定了Vec,String,HashMap,HashSet
和VecDeque
的try_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
不再在当前目录
中搜索可执行文件.这是win32
的CreateProcessAPI
的遗留行为,因此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
)来使它们变小,一般很有用.
虽然,创建
二进制文件后总是可手动
这样,但cargo
和rustc
现在支持在链接
二进制文件时去掉.要启用
此功能,在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
相关文章:
2311rust,到60版本更新
1.54.0稳定版 属性可调用类似函数的宏 Rust1.54支持在属性中调用类似函数的宏.类似函数的宏是像基于macro_rules!宏一样调用的或像macro!(...)一样的过程宏. 注意,常见用例是,在Rust文档注解中包含其他文件中的文档.如,如果项目的README代表了一个很好的文档注释,则可用incl…...

【开源】基于Vue和SpringBoot的微信小程序的音乐平台
项目编号: S 055 ,文末获取源码。 \color{red}{项目编号:S055,文末获取源码。} 项目编号:S055,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示 四、核心代码4.1 查询单首…...

adb手机调试常用命令
查看手机型号 adb shell getprop ro.product.model 查看电池状况 adb shell dumpsys battery 查看分辨率 adb shell wm size 查看屏幕密度 adb shell wm density 查看显示屏参数 adb shell dumpsys window displays 查看android_id adb shell settings get secure android…...
IDEA常用插件合集
功能类: 1、Background Image Plus 换壁纸 2、Chinese(Simplified)... 中文语言包 3、Translation 代码翻译 4、Key Promoter X 快捷键提示插件 5、Rainbow bracket 彩虹括号插件 6、Code Glance 代码小地图 效率类 : 1、Tabnine AI Code C…...

【算法】滑动窗口题单——2.不定长滑动窗口(求最长/最大)
文章目录 3. 无重复字符的最长子串1493. 删掉一个元素以后全为 1 的最长子数组904. 水果成篮1695. 删除子数组的最大得分2841. 几乎唯一子数组的最大和2024. 考试的最大困扰度1004. 最大连续1的个数 III1438. 绝对差不超过限制的最长连续子数组2401. 最长优雅子数组解法1——维…...

电子学会C/C++编程等级考试2022年03月(一级)真题解析
C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...

Libvirt-Qemu-Kvm 操作手记
(持续更新~) 本文主要用于记录在操作libvirt qemu kvm过程中遇到的问题及原因分析。 Hugepage 让qemu使用大页可以减少tdp的size,一定程度上可以提高性能;使用大页可以用memfd或者file backend。 memfd 操作步骤如下: 在系统中reserv…...
代码随想录算法训练营第二十八天| 78 子集 90 子集|| 93 复原IP地址
78 子集 由题意可知数组中的元素互不相同,所以在dfs中我们可以将当前的path直接加入到res中。 class Solution {List<List<Integer>>res new ArrayList<>();List<Integer>path new LinkedList<>();public List<List<Integer…...

9 HDFS架构剖析
问题 100台服务器,存储空间单个200GB 20T 5T文件如何存储? 128MB一块 128MB81GB 1288*10241TB 5T数据分成的128MB的块数 8192 * 5 客户端(client)代表用户通过与namenode和datanode交互来访问整个文件系统。 HDFS集群有两类节点: 一个na…...
Python中的迭代器、生成器和装饰器
当谈到Python中的迭代器、生成器和装饰器时,这三个概念都是与函数和数据处理密切相关的。让我们逐个深入了解它们。 1. 迭代器(Iterators): 迭代器是一个可以逐个访问元素的对象。在Python中,迭代器实现了两个方法&a…...
【NGINX--1】基础知识
1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息,并安装一些有助于配置官方 NGINX 软件包仓库的软件包: apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...
小米路由器AX1800降级后的SSH登录和关墙等命令
http://192.168.31.1/cgi-bin/luci/;stok429aaa9c7f05ee7d0816a00257b8414a/api/misystem/set_config_iotdev?bssidXiaomi&user_idlongdike&ssid-h%3B%20nvram%20set%20ssh_en%3D1%3B%20nvram%20commit%3B%20sed%20-i%20s%…...
5-什么是猴子补丁,有什么用途?什么是反射,python中如何使用反射?http和https的区别?
1 什么是猴子补丁,有什么用途 **解释**1 Python猴子补丁(Monkey Patch)是一种在运行时动态修改代码的技术。通在不修改源代码的情况下,改变代码的执行方式或增加功能2 Monkey Patching是在 运行时(run time) 动态替换属性(attrib…...

深信服AC应用控制技术
拓扑图 目录 拓扑图 一.上班时间不允许使用qq(假设上班时间是上午9到12,下午14到18) 1.新增上班时间不允许使用qq访问权限策略 2.将策略应用到组,例如修仙部 3.验证 上班时间发现登录不了 下班时间可以登录 二.上班时间不允许访问视频网站(假设上班时…...

全新云开发工具箱:融合多项功能的微信小程序源码解决方案
全新云开发工具箱:融合多项功能的微信小程序源码解决方案 这款微信小程序源码提供了超过40个功能,集合了各种实用工具,成为一款全能工具箱。这些功能包括证件照制作、垃圾分类查询、个性签名制作、二维码生成、文字九宫格、手持弹幕、照片压…...

Android跨进程通信,IPC,RPC,Binder系统,C语言应用层调用
文章目录 Android跨进程通信,IPC,RPC,Binder系统,C语言应用层调用()1.概念2.流程3.bctest.c3.1 注册服务,打开binder驱动3.2 获取服务 4.binder_call Android跨进程通信,IPC…...

数据结构【DS】栈
共享栈 共享栈的目的是什么? 目的:有效利用存储空间。 共享栈的存取数据时间复杂度为? 存取数据时间复杂度为O(1) 共享栈如何判空?如何判满? 两个栈的栈顶指针都指向栈顶元素,𝑡𝑜𝑝…...
提高视频性能的 5 种方法
摆脱共享托管计划 如果您的网站每月收到数千名访问者,那么现在是时候放弃许多企业家和小型企业开始使用的共享托管计划了。在启动网站时选择廉价的托管计划是可以理解的,因为此类计划通常足以使用一年或更长时间,而不会影响性能。 在共享托…...
python有哪些高级的技术
Python作为一种功能强大且灵活的编程语言,具有许多高级技术和功能。以下是一些Python中常见的高级技术: 函数式编程:Python支持函数式编程范式,包括高阶函数、匿名函数(lambda函数)、闭包、以及针对序列的函…...

系列五、怎么查看默认的垃圾收集器是哪个?
一、怎么查看默认的垃圾收集器是哪个 java -XX:PrintCommandLineFlags -version...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...
redis和redission的区别
Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...

消息队列系统设计与实践全解析
文章目录 🚀 消息队列系统设计与实践全解析🔍 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡💡 权衡决策框架 1.3 运维复杂度评估🔧 运维成本降低策略 🏗️ 二、典型架构设计2.1 分布式事务最终一致…...

ZYNQ学习记录FPGA(一)ZYNQ简介
一、知识准备 1.一些术语,缩写和概念: 1)ZYNQ全称:ZYNQ7000 All Pgrammable SoC 2)SoC:system on chips(片上系统),对比集成电路的SoB(system on board) 3)ARM:处理器…...