< 返回版块

Mike Tang 发表于 2020-02-02 21:35

Tags:rust

2020年1月30日 The Rust Release Team

Rust 1.41.0 于美国时间 2020年1月30日 发布。来看看主要有哪些改进。

孤儿规则适当放宽

孤儿规则(orphan rule)指的是

A trait impl is only allowed if either the trait or the type being implemented is local to (defined in) the current crate as opposed to a foreign crate.

在 1.41.0 之前,下面这种写法是不行的:

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

或者更一般的表达:

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

这是不行的,因为 FromVec 都定义在标准库中,相对于当前 crate 是外部 crate. 虽然有的时候可以通过 newtype 这种设计模式来绕过,但始终还是有很多不方便,甚至不可能。

Rust 1.41.0 中,适当放宽了孤儿规则限制:只要 trait 带一个本地类型作为泛型参数,就可以通过编译。所以 Rust 1.41.0 支持上述写法。不再需要绕弯子了。

cargo install 加强

以往,我们要用 cargo install 安装一个工具的时候,如果之前已经安装过同一个工具的老版本,它会在编译完后,再说,已经有一个老版本存在了,安装失败。浪费时间和能量。

也可以加 --force 参数,强制安装。但是这个意义还是有些区别的。

现在,如果之前装过工具,直接执行 cargo install,会自动升级这个工具的版本到最新。

与 git 配合更加友好的 Cargo.lock 内容格式

之前我们开发,特别是多人协作开发的时候,Cargo.lock 往往会成为一个捣蛋鬼,可能代码其它地方并没有改变,只是重新编译了一次,结果生成了不同的 Cargo.lock 文件,结果被提交到 git 仓库中了。给 git 历史带来了无效的提交,对别人也是一种干扰。

甚至还会造成一些合并冲突。

现在,优化了 Cargo.lock 的格式。解决了上述那些问题。详情请看原文。

FFI 的时候可以直接用 Box 了

Box<T>, 其中,T: Sized,现在与 C 语言的 指针类型(T*)ABI 兼容了。所以,现在可以直接这样写了:

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>>) {}

方便好多啊,而且更自然,更形象了。更细致的说明,请阅读下面英文原文。

其它

  • 对 32-bit Apple 编译目标即将停止支持,1.41.0 是最后一版支持了。
  • 标准库中的一些函数,稳定了;
  • 其它一些细节,请参考原文。

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

评论区

写评论

还没有评论

1 共 0 条评论, 1 页