请选择 进入手机版 | 继续访问电脑版
Mozilla

火狐社区

登录    注册

QQ互联

Rust 是什么?漫画图解让你一目了然(下篇)

yingliu Mozilla员工 发表于 2019-2-28 16:22:51 | 显示全部楼层 |阅读模式 [复制链接]
0 7248
本帖最后由 yingliu 于 2019-3-1 11:44 编辑

(接上篇

作者:Lin ClarkRust 团队

下一步是什么?

工作小组抽取出许多 CLI 中通用的不同任务,但还有更多可被抽象化的任务。接下来,工作小组将建立更多高阶的函数库,并陆续解决更多的问题。

Rust 工具

03_01-tooling-1-768x668.png

想要体验一个语言,最好的方法是通过工具体验。第一步便是要从你使用的编辑器开始,再延续至开发和维护的各个阶段。

换言之,语言的生产力取决于高效的工具。

以下是一些随着 Rust2018 发布的工具(和针对 Rust 既有工具提供的改进)。

IDE 支援

当然,高效率的前提是要能将程序代码从脑中快速地转到屏幕上,其中的关键是 IDF 的支持。为了支持 IDEs,我们需通过工具让 IDE 知道 Rust 程序代码的含意,如:告诉 IDE 什么样的字符串才算完成了程序代码。

在 Rust 2018 的改进过程中,社区特别锁定 IDEs 所需的功能。通过 Rust Language Server 和 IntelliJ Rust,现在许多 IDEs 已享有完备的 Rust 支持。

加快编译过程

以编译来说,速度越快就越有生产力,所以,我们把编译程序变快了。

以前编译 Rust crate 时,编译程序会重复编译该 crate 中每一个单独的文件。现在,因为有了增量编译 (incremental compilation) 功能,编译程序变聪明了,而只会重复编译变更之处。与其他优化搭配下,这大大加快了 Rust 编译程序的速度。

rustfmt

高效率的另一关键是不必费心解决风格问题(以及不必再为格式规则争论不休)。

对此,rustfmt 采用默认的风格(是经过社区达成共识的风格),自动将程序代码重新格式化。使用 rustfmt 可确保所有的 Rust 程序代码都采用同一风格,就像 C++ 采用 clang format 和 JavaScript 采用 Prettier 一样。

Clippy

我们都有想向经验老到的顾问咨询的时候,以在编写程序代码的过程中取得最佳实际的建议。这就是 Clippy 的效果——它能在编码过程中检查程序代码,并提供写出更符合语用习惯的程序代码的建议。

rustfix

不过,如果你手上有的是一个采用过时用语的老程序代码库,取得提示及动手改程序代码的过程恐怕很枯燥乏味。你只希望有人能帮你更正程序代码库的问题。

在那种情况下,rustfix 便可将整个流程自动化。它将运用来自 Clippy 等工具的 lints 和更新较老旧的程序代码,以符合 Rust 2018 语法的需要。

Rust 本身的变更

这些在生态系中的改变已在许多层面提高了生产力,但有些生产力问题只能通过语言本身的变更来解决。

04_01-language-768x579.png


就像我在一开始的说明中所提到的,针对 Rust 语言的大部分变更都与现有的 Rust 程序代码完全兼容。这些变动都是 Rust 2018 的一部分。不过,因为它们不会破坏任何程序代码,所以,就算该程序代码不使用 Rust 2018,也可在所有的 Rust 程序代码中运行。

我们先来看一些已纳入各版本的重大Rust 语言功能,然后再来看 Rust 2018 独有功能的小列表。

所有版本通用的新语言功能

下面是一些 Rust 语言现阶段(及未来)的重大功能更新。

更精确的 borrowchecking(如:NLL (非词汇生命周期))

Rust 的一大卖点是借用检查器(borrowchecker)。虽然借用检查器可确保程序代码的内存安全性,但一直是令 Rust 新手闻之色变的大挑战。

原因之一是新手必须学新的概念,除此以外,还有另一个更大的问题……借用检查器有时会拒绝一些连了解那些概念的人看起来都没问题的程序代码。

04_03-nll-01-768x411.png

这是因为借用 (borrow) 一次的生命期 (lifetime) 应持续到其作用范围 (scope) 结束为止,例如:持续到该变量所在的函数尾端。

也就是说,就算变量的值已经失效且不再存取该值,一直到函数结束为止,其他的变量仍将被拒绝存取。

为解决此问题,我们也把借用检查器变聪明了。现在,它可以看到哪个变量真的不需要某个值,一发现该变量值的生命期告终,就不会拦阻其他数据的借用。

04_04-nll-02-768x466.png

目前,此功能仅于 Rust2018 落地,但在不久的将来便将于所有版本上线。届时我也将撰文说明。

稳定版 Rust 引入程序式宏(procedural macros)

Rust 在 Rust 1.0 以前已有宏 (macro) 的功能。不过,随着 Rust 2018 的发布,我们也推出一些重大改善,包括加入程序式宏 (procedural macros)。

程序式宏的用途类似于让你添加自己的语法到 Rust 中。

Rust 2018 提供两种不同程序式宏:

「函数」类宏

函数类的宏提供类似正常函数调用的东西,但这些东西实际上会在编译时执行。它们会接受一些程序代码和输出不同程序代码,后者再由编译程序插入二进制文件中。

它们存在已久,但支持的功能非常有限。你的宏只能取得输入码(input code)并对其执行 match statement,而无法查看该输入码内的所有代码 (token)。

现在,有了程序式宏的帮忙后,你可获得和剖析器 (parser) 一样的输入值,也就是代码流 (token stream)。换句话说,你就能建立更强大的函数类宏。

「属性」类宏

如果你对 JavaScript 等语言中的装饰器 (decorator) 很熟悉的话,就会发现它们和属性类宏有诸多相似之处。它们让你在Rust 中注释一些应被预处理及转换为其他内容的程序代码。

derive 宏的用途正是如此。当你把derive 放到一个结构上,编译程序便将接收该结构(在这之前此结构会先被剖析成一个代码清单)并予以处理。编译程序将从特征 (trait) 中加入函数的基本操作。

更合乎习惯的匹配借用

这个变更很明确易懂。

以前,如果你想借点东西来执行匹配(match) 的话,就必须加入一些奇怪的语法:

04_06-match-768x249.png

不过,现在你不需要再写&Some(ref s) 了,而只要写 Some(s),Rust 就能帮你完成匹配。

Rust 2018 特有的新功能

Rust 2018 还有一些独有的新功能。以下列出Rust 2018 已加入的部分更新:

关键词
Rust 2018 中新增了一些关键词。
  • try 关键词
  • async/await 关键词

这些功能尚未完全实现,但其关键词正于 Rust 1.31 落地。也就是说,等到这几个关键词背后的功能正式实现后,我们就不必再引入新的关键词了(新增关键词会造成重大变更)。

模块系统
对于想学习 Rust 语言的开发者而言,模块系统是一大痛点,而原因也不难理解:因为以前很难推论 Rust 会选择使用哪个模块。

为解决此问题,我们稍微调整了Rust 中路径的运行模式。

例如,以前,当你汇入一个crate 后,你可在最顶层的路径中使用它。但若将程序代码中的任何一部分移入子模块,它就将失去作用。

// 顶层模块
extern crate serde;
// 这在顶层中可顺利执行
implserde::Serialize for MyType { … }
mod foo {
// 但无法在子模块中运作
implserde::Serialize for MyType { … }
}

另一个例子是前缀 ::,它被用来指称 crate root 或外部 crate。以前,我们很难判断它到底指向的是两者中的哪一个。

因此,Rust 2018 将此区分得更明确。现在,如果你想参照 crate root,就改用前缀 crate::。除此以外,我们还推出一些有助于加强路径明确性的改进。

如果你手上有 Rust 程序代码而希望它采用 Rust 2018 的话,那你很可能得为这些新的模块路径来更新程序代码。不过,别担心,你不必手动更新。只要在将新版本 specifier 加到 Cargo.toml 前先执行 cargo fix,rustfix 便将帮你处理所有的更新。

进一步了解
请参考 Rust2018 版本指南,全盘掌握新版本的所有内容。




您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表