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> {
// ...
}
这是不行的,因为 From
和 Vec
都定义在标准库中,相对于当前 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
评论区
写评论还没有评论