首页 资讯频道 互联频道 智能频道 网络 数据频道 安全频道 服务器频道 存储频道

Rust 1.41.0 发布 放宽对trait实现的限制

2020-02-05 12:11:26 来源 : 开源中国

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

放宽对trait实现的限制

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

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

impl From> for Vec {

// ...

}

这是模式的一个实例:

impl ForeignTrait for ForeignType {

// ...

}

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 时有更多保障

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

Box::new(Foo)

}

// The possibility of NULL is represented with the `Option<_>`.

#[no_mangle]

pub extern "C" fn foo_delete(_: Option>) {}

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

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

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

相关文章

最近更新