Rust 1.41.0 发布,带来多项新特性

五迷三道 提交于 2020-04-10 09:44:42

https://www.oschina.net/news/113158/rust-1-41-0-released

Rust 1.41.0 发布了,此版本亮点包括放宽对 trait 实现的限制、改进cargo install、对git更友好的 Cargo.lock以及Box<T>与 FFI 相关的新保障。

放宽对 trait 实现的限制

为了防止当依赖项添加新 trait impl 时生态系统崩溃,Rust 强制执行孤立规则。其要点是,仅当所实现的 trait 或 type 是在本地定义而不是外部 crate ,才允许使用 trait impl。但是,当涉及泛型时会变得复杂。

在 Rust 1.41.0 之前,孤立规则过于严格,造成了问题。例如,假设 crate 定义了 BetterVec<T> 结构,并且想要一种将结构转换为标准库的 Vec<T> 方法,需要编写以下代码:

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

这是模式的一个实例:

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

Rust 1.40.0 中,孤立规则禁止使用该 impl,因为 From 和 Vec 均在标准库中定义,这对于当前 crate 而言属于外部。有一些方法可以解决该限制,例如 newtype 模式,但是在某些情况下,它们通常很麻烦,甚至是不可能的。

尽管 From 和 Vec 都是外部的,但 trait(本示例中为 From)是由本地 type 参数化的,这样 Rust 1.41.0 就允许该 impl。

过期时 cargo install 更新软件包

使用 cargo install,可以在系统中安装二进制 crate,社区经常使用该命令来安装用 Rust 编写的流行 CLI 工具。从 Rust 1.41.0 开始,如果自安装以来发布了新版本,cargo install 还将更新该 crate 的现有版本。在此之前,唯一的选择是传递 --force 标志,问题是就算软件是最新的,它也会重新安装。

较少发生冲突的 Cargo.lock 格式

为了确保构建的一致性,Cargo 使用名为 Cargo.lock 的文件,其中包含依赖项版本和校验和。但是在单独的分支中更改依赖项时,数据在其中的排列方式导致不必要的合并冲突。Rust 1.41.0 为文件引入了一种新格式,专门设计用于避免这些冲突。这种新格式将用于所有新的 lock 文件,而现有的 lock 文件仍将依赖以前的格式。

在 FFI 中使用 Box<T> 时有更多保障

从 Rust 1.41.0 开始,Box<T> 中 T:Sized 现在与 C 语言的指针(T*)类型 ABI 兼容,因此,如果有一个从 C 端调用的 extern "C" Rust 函数,则 Rust 函数现在对于某些特定的 T 可以使用 Box<T>,这对应于 C 中的 T* 函数。

例如,在 C 端可能有以下代码:

// C header */

// Returns ownership to the caller.
struct Foo* foo_new(void);

// Takes ownership from the caller; no-op when invoked with 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)
}

// The possibility of NULL is represented with the `Option<_>`.
#[no_mangle]
pub extern "C" fn foo_delete(_: Option<Box<Foo>>) {}

但是需要注意,尽管 Box<T> 和 T* 具有相同的表示形式和 ABI,但 Box<T> 仍必须为非 null、align 并准备好由全局分配器释放。为确保这一点,最好仅使用源自全局分配器的 Box。

此外还有一些库的变更,以及即将减少对 32 位 Apple 平台的支持,从 1.42.0 开始,像 i686-apple-darwin 平台将降级到最低的支持层。

完整更新内容查看发布说明:

https://blog.rust-lang.org/2020/01/30/Rust-1.41.0.html

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!