2510rs,rust,1.84
原文
1.84.0
稳定版中有什么
Cargo
考虑Rust
版本来选择依赖版本
1.84.0
稳定了最低支持的Rust
版本(MSRV
)的更喜欢与项目声明的MSRV
兼容的依赖版本
的相关解析器
.
通过MSRV
相关版本选择,维护者无需为每个依赖
手动选择旧版本
,从而减少了支持旧工具链
的工作量
.
可通过.cargo/config.toml
选入MSRV
相关解析器
:
[resolver]
incompatiblerustversions = "fallback"
然后,在添加依赖时:
$ cargo add clap
在验证CI
中的最新依赖时,可覆盖以下内容:
$ CARGO_RESOLVER_INCOMPATIBLE_RUST_VERSIONS=allow cargo update
也可通过在Cargo.toml
清单文件中,设置package.resolver="3"
来选入,但这需要将MSRV
提高到1.84
.对使用2024
版本(将在1.85
中稳定下来)的项目,将默认启用
新的解析器
.
这给库作者
在决定采取
新的Rust
工具链功能的策略时,提供了更大的灵活性
.
以前,采取新Rust
工具链功能的库,会强制拥有旧Rust
版本的该库的下游用户,升级他们的工具链
或手动选择与其工具链兼容的旧版本
的库(并避免运行cargo update
).
现在,这些用户将可自动使用
与其旧工具链
兼容的旧库版本
.
有关决定MSRV
策略时的更多注意,见文档.
开始迁移新的特征求解器
Rust编译器
正在为特征
求解器,迁移到新实现.下一代特征求解器
是对Rust
类型系统核心组件
的重新实现
.
它不仅负责检查特征边界
(如Vec<T>:Clone
)是否成立,而且类型系统
的许多其他部分还使用它,如规范化
,找出<Vec<T>as IntoIterator>::Item
的底层类型
和等价类型
(检查T和U
是否相同).
在1.84
中,用新的求解器
来检查特征实现
的一致性
.在高层次上,一致性
负责确保对给定类型
的特征最多有一个实现
,同时考虑其他箱
中尚未编写或可见的代码
.
该稳定化修复了旧实现
的一些主要是理论上的正确性
问题,导致潜在的以前未报告的"特征的冲突实现
…"的错误.
根据求值Crater
可用代码,期望受影响的模式
会很少.稳定版还提高了证明实现
不覆盖的能力,允许有时编写更多代码
.
更多细节
,见之前的博客文章和稳定报告.
这里
这里
严格的源API
在Rust
中,指针
不仅是一个"整数"或"地址"
.如,即使你"幸运"
且在读/写
释放的内存之前再分配了它,"释放后使用
"也是未定义行为
.
再举一例,即使通过不同指针
写入同一地址
是合法的,通过从&i32
引用继承的指针写入
是未定义行为
.这里的底层模式
是,指针的计算方式
很重要,而不仅是计算产生的地址
.
因此,说指针是有出处
的:要完全表征Rust
中与指针相关的未定义行为
,不仅必须知道指针指向的地址
,还必须跟踪它从哪些其他指针
"继承".
一般,不需要太担心出处
,如何继承指针
是非常清楚
的.但是,当来回在整数转换指针
时,则低估了生成的指针的出处
.
在此版本中,Rust
添加了一组API
,这些API
在许多时候可替换
整数指针转换的使用,从而避免此类转换
固有的歧义.
特别是,现在可无需按整数来回转换指针
,实现使用对齐指针的最低位
来存储额外信息
的模式.这使得代码更容易
分析,编译器更容易
分析,且还有利于Miri
等工具和CHERI
等架构为了检测和诊断
指针误用.
更多细节
,见有关出处的标准库
文档,这里.
稳定的API
Ipv6Addr::is_unique_local
Ipv6Addr::is_unicast_link_local
core::ptr::with_exposed_provenance
core::ptr::with_exposed_provenance_mut
<ptr>::addr
<ptr>::expose_provenance
<ptr>::with_addr
<ptr>::map_addr
<int>::isqrt
<int>::checked_isqrt
<uint>::isqrt
NonZero::isqrt
core::ptr::without_provenance
core::ptr::without_provenance_mut
core::ptr::dangling
core::ptr::dangling_mut
Pin::as_deref_mut
如下在常环境
下已稳定:
AtomicBool::from_ptr
AtomicPtr::from_ptr
AtomicU8::from_ptr
AtomicU16::from_ptr
AtomicU32::from_ptr
AtomicU64::from_ptr
AtomicUsize::from_ptr
AtomicI8::from_ptr
AtomicI16::from_ptr
AtomicI32::from_ptr
AtomicI64::from_ptr
AtomicIsize::from_ptr
<ptr>::is_null
<ptr>::as_ref
<ptr>::as_mut
Pin::new
Pin::new_unchecked
Pin::get_ref
Pin::into_ref
Pin::get_mut
Pin::get_unchecked_mut
Pin::static_ref
Pin::static_mut