查看原文
其他

Rust 1.41.0 发布更新要点

The following article is from Rust语言中文社区 Author Mike Tang

Mike Tang,一块链习《Substrate快速入门与开发实战》课程助教,Cdot 核心开发者,Rust.cc 社区创始人
Rust 1.41.0 于美国时间 2020年1月30日 发布。来看看主要有哪些改进。


.01 孤儿规则适当放宽


孤儿规则(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 支持上述写法,不再需要绕弯子了。


.02 Cargo install 加强


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

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

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


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



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

给 git 历史带来了无效的提交,对别人也是一种干扰。甚至还会造成一些合并冲突。

现在,优化了 Cargo.lock 的格式,解决了上述那些问题。
详情请阅读原文https://blog.rust-lang.org/2020/01/30/Rust-1.41.0.html。


.04 FFI 的时候可以直接用 Box 了


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

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

方便好多啊,而且更自然,更形象了。
更细致的说明,请阅读原文https://blog.rust-lang.org/2020/01/30/Rust-1.41.0.html。



其它


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




更多阅读:
▎全球第一门 Substrate 开发课第3期学员顺利毕业!第三届Substrate Hackathon 挑战赛完整复盘▎Subdev 周记 | 什么样才算是区块链真正的落地

扫码关注公众号,回复“1”加入开发者社群

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存