Rust 1.41.0 发布,带来多项新特性
时间:2020-02-12 11:17 来源:linux.it.net.cn 作者:IT
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 (责任编辑:IT)
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 (责任编辑:IT) |