小言_互联网的博客

Rust 1.41.0 发布更新要点

269人阅读  评论(0)

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 之前,下面这种写法是不行的:


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

或者更一般的表达:


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

这是不行的,因为 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 这边


   
  1. // C header */
  2. // Returns ownership to the caller.
  3. struct Foo* foo_new(void);
  4. // Takes ownership from the caller; no-op when invoked with NULL.
  5. void foo_delete( struct Foo*);

Rust 这边


   
  1. #[repr(C)]
  2. pub struct Foo;
  3. #[no_mangle]
  4. pub extern "C" fn foo_new() -> Box<Foo> {
  5. Box:: new(Foo)
  6. }
  7. // The possibility of NULL is represented with the `Option<_>`.
  8. #[no_mangle]
  9. pub extern "C" fn foo_delete(_: Option<Box<Foo>>) {}

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

其它

  • 对 32-bit Apple 编译目标即将停止支持,1.41.0 是最后一版支持了。

  • 标准库中的一些函数,稳定了;

  • 其它一些细节,请参考原文。


转载:https://blog.csdn.net/u012067469/article/details/104151699
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场