Cargo考虑Rust版本来选择依赖版本
1.84.0稳定了支持的最低Rust版本(MSRV)感知解析器,该解析器首选与项目声明的MSRV兼容的依赖版本。通过MSRV感知版本选择,维护者无需为每个依赖项手动选择旧版本,减少了支持旧工具链的工作量。
您可以通过.cargo/config.toml
选择加入MSRV-aware解析器:
[resolver]
incompatible-rust-versions = "fallback"
然后,在添加依赖项时:
$ cargo add clap
Updating crates.io index
warning: ignoring clap@4.5.23 (which requires rustc 1.74) to maintain demo's rust-version of 1.60
Adding clap v4.0.32 to dependencies
Updating crates.io index
Locking 33 packages to latest Rust 1.60 compatible versions
Adding clap v4.0.32 (available: v4.5.23, requires Rust 1.74)
当验证CI中的最新依赖项时,您可以覆盖此:
$ CARGO_RESOLVER_INCOMPATIBLE_RUST_VERSIONS=allow cargo update
Updating crates.io index
Locking 12 packages to latest compatible versions
Updating clap v4.0.32 -> v4.5.23
您还可以通过在Cargo.toml清单文件中设置package.resolver = "3"
来选择加入,尽管这将需要将您的MSRV提高到1.84。默认情况下,新解析器将为使用2024版本(将在1.85中稳定)的项目启用。
这为图书馆作者在决定采用新的Rust工具链功能的政策时提供了更大的灵活性。以前,采用新Rust工具链功能的库将迫使拥有旧Rust版本的该库的下游用户升级其工具链或手动选择与其工具链兼容的旧版本的库(并避免运行“cargo update”)。现在,这些用户将能够自动使用与其旧工具链兼容的旧库版本。
有关决定MSRV政策时的更多考虑因素,请参阅文档。
迁移到新特征求解器开始
Rust编译器正在向特征求解器的新实现过程中。下一代特征求解器是对Rust类型系统核心组件的重新实现。它不仅负责检查特征边界是否-例如Vec<T>: Clone
- hold,但也被类型系统的许多其他部分使用,例如归一化-将<Vec<T>的底层类型确定为IntoIterator>::Item
-并等同类型(检查T
和U
是否相同)。
在1.84中,新的求解器用于检查特征impls的一致性。在高层次上,一致性负责确保给定类型的特征最多有一个实现,同时考虑其他板条箱中尚未编写或可见的代码。
这种稳定修复了旧实现的一些主要理论正确性问题,导致潜在的“特征的冲突实现……”以前没有报告的错误。根据通过Crater对可用代码的评估,我们预计受影响的模式非常罕见。稳定还提高了我们证明impls不_重叠的能力,在某些情况下允许编写更多的代码。
严格来源API
在Rust中,指针不仅仅是一个“整数”或“地址”。例如,“释放后使用”是未定义的行为,即使你“幸运”,释放的内存在读/写之前被重新分配。另一个例子是,通过从&i32
引用派生的指针写入是未定义的行为,即使通过不同的指针写入同一地址是合法的。这里的基本模式是_指针的计算方式很重要_,而不仅仅是此计算产生的地址。出于这个原因,我们说指针有出處:为了充分表征Rust中与指针相关的未定义行为,我们不仅必须知道指针指向的地址,还必须跟踪它“来自”的其他指针。
大多数时候,程序员不需要太担心来源,而且指针是如何衍生的非常清楚。然而,当将指针转换为整数并返回时,结果指针的来源被低估了。随着这个版本,Rust正在添加一组API,在许多情况下,这些API可以取代整数指针铸件的使用,从而避免了此类铸件固有的歧义。特别是,使用对齐指针的最低位来存储额外信息的模式现在可以实现,而无需将指针转换为整数或向后。这使得代码更容易推理,更容易为编译器进行分析,也有利于Miri等工具和CHERI等架构,旨在检测和诊断指针误用。
有关更多详细信息,请参阅标准库出处文件。
稳定的API
这些API现在在const上下文中是稳定的