Rust也出2077?受欢迎的编程语言再度更新!

新闻 前端
Rust语言是一种高效、可靠的通用高级语言,同时兼顾了开发效率和执行效率。Rust除了能够胜任性能敏感的任务以外,也在内存和线程安全方面有着极高的可靠性。

Rust语言是一种高效、可靠的通用高级语言,同时兼顾了开发效率和执行效率。Rust除了能够胜任性能敏感的任务以外,也在内存和线程安全方面有着极高的可靠性。

在更新了1.52.1后,Rust又宣布了2021版本新的计划:在10月份发布1.56。

[[399818]]

 目前的1.52.1版本主要是针对增量编译产生的错误提供了临时的解决方案:

禁用 Rust 编译器中的增量编译(如需开启,则设置环境变量RUSTC_FORCE_INCREMENTAL = 1)。

对于启用了增量编译的场景,改进了用于新验证的诊断输出,指示了如何通过清除增量状态或禁用增量来解决错误。

用过的都说:真香!

你或许不知道,Rust在stackoverflow的调查中连续五年被选为最受开发者喜爱的编程语言。更是有不少知名巨头将Rust语言加入到他们的项目中。

在用户喜爱榜中Rust一骑绝尘,根本看不到第二名在哪儿

Microsoft正在将Rust集成到大型的项目中。有大约70%漏洞都与内存安全有关,于是便寻求更具安全性的Rust帮助其解决这一困扰许久的问题。

Facebook则把Rust用在了源码控制后端的代码重写上。由于Rust可以在编译时检查出代码的错误,从而有效地减少了bug所带来的经济损失。

Dropbox使用Rust对文件同步引擎的代码进行了重写。高并发的文件同步引擎,在编写、测试和调试方面都十分困难,而Rust在静态类型和编译检查方面要比正在使用的Python性能更强。

甚至Linux内核也即将在5.14中加入对Rust的支持,毕竟C++太烂了(不是我说的,是Linus说的)。

「C++ solves _none_ of the C issues, and only makes things worse.」

网友对即将来临的更新很兴奋!

 「我已经等不及了。作为使用Python的人,我真的很想念对混合了变量的字符串的简单直观的处理。」

「所有edition都会被永久支持。这让Rust 2015的代码和Rust 2077的代码的融合变为可能。」

「感谢所有Rust志愿者,你们是最棒的!」

2021更新计划中都有什么?

1. Edition 是什么?

Rust提出了一种Edition更新形式,这种方式不会割裂生态系统。

一个向后不兼容的功能将会被作为新的Rust Edition的一部分。Edition是选择性加入的,因此,除非现有的crate明确迁移到新版本中,否则就不会看到这些变化。

一个Edition中的crate可以与其他Edition中编译的crate无缝地互操作。不管Edition如何,所有 Rust代码最终都会在编译器中编译为相同的内部 IR。

Edition的迁移也几乎是全自动的。在发布新Edition的同时,会附带一个自动迁移工具。除此以外,还有一本《版本迁移指南》,该指南既是版本的概述,也是在遇到问题的故障排除参考。

在对旧的版本进行迁移时,需要对代码进行一些小的更改。例如,当迁移到Rust 2018时,所有的「async」都会变为:「r#async」。

2. prelude中新的内容

Rust编译器会优先处理手动导入的项,使得在prelude添加的内容不会破坏任何现有代码。

例如,一个名为「example」的crate或module,其中包含「pub struct Option ;」,那么可以通过使用「example::*;」,使得「Option」明确引用「example;」而不是标准库中的。

但是,在prelude中添加特征便可能会破坏现有代码。例如,在使用「MyTryInto」特征调用「x.try_into()」时,如果还导入了「std」的「TryInto」,则会出现无法编译的情况,因为它提供了具有相同名称的方法。

作为解决方案,Rust 2021将使用新的prelude,其中增加了三个新的功能:

  1. std::convert::TryInto 
  2.  
  3. std::convert::TryFrom 
  4.  
  5. std::iter::FromIterator 

 3. 默认使用Cargo功能解析器

自1.51.0起,Cargo在选择加入中有了对新的功能解析器的支持,该功能可以在「Cargo.toml」中使用「resolver = "2"」激活。

从Rust 2021开始,这将是默认设置。也就是说,在「Cargo.toml」中写入「edition = "2021"」就意味着「resolver = "2"」。

4. 数组迭代器IntoIterator

在Rust 1.53.0之前,「IntoIterator」只能用于数组的引用。也就是说可以遍历「&[1, 2, 3]」和「&mut [1, 2, 3]」,但不能直接遍历「[1, 2, 3]」。

  1. for &e in &[123] {} // Ok :) 
  2.  
  3. for e in [123] {} // Error :( 

团队在1.53.0之后所有版本中添加特征实现。在Rust 2015和2018代码中,编译器仍会将「 array.into_iter()」解析为「(&array).into_iter()」。

这仅适用于「.into_iter()」调用语法, 而不会影响任何其他语法,例如「for e in [1, 2, 3]」,「iter.zip([1, 2, 3])」或「IntoIterator::into_iter([1, 2, 3])」。

5. 闭包(closures)的捕获

闭包会自动从代码块中捕获所有的引用。例如,「|| a. + 1」会自动从周围的上下文中捕获对「a」的引用,不仅仅是「a.x」。这会在某些情形下造成问题。

  1. let a = SomeStruct::new(); 
  2.  
  3. drop(a.x); //Move out of one field of the struct 
  4.  
  5. println!("{}"m a.y); // OK: Still use another field of the struct 
  6.  
  7. let c = || println!("{}", a.y); // Error: Tries to capture all of 'a' 
  8.  
  9. c(); 

当结构的某个字段被借用或移出时,其他字段将无法再用于闭包中,因为整个结构都会因为被捕获而变得不再可用。

从Rust 2021开始,闭包将仅捕获其使用的字段。

由于这个变化会对字段的删除顺序造成影响,目前仅在新版本中被激活。如果像以前一样捕获整个结构,则可通过在闭包中插入「let _ = &a; 」得到。对于其他版本,可以使用自动迁移,从而更新相关的闭包。

6. Panic宏的一致性

「panic!()」宏仅在使用多个参数调用时才使用字符串格式。当使用单个参数调用时,它甚至不会查看该参数。

  1. let a = "{"
  2.  
  3. println!(a); // Error: First argument must be a format string literal 
  4.  
  5. panic!(a); // Ok: The panic macro doesn't care 

一旦隐式格式参数被确定,就会出现问题了。此时「println!("hello {name}")」会变成「println!("hello {}", name)」的简写形式。但是「panic!("hello {name}")」无法执行,因为「panic!()」不会将单个参数作为格式化字符串处理。

为了避免这种情况,Rust 2021提供了更具一致性的「panic!()」宏。新的「panic!()」宏将不再接受任意表达式作为唯一参数。而是像「println!()」一样,始终将第一个参数作为格式化字符串处理。

由此「panic_any()」便成为了对格式化字符串以外的其他内容进行「panic」的唯一方法。

另外,Rust 2021中的「core::panic!()」和「std::panic!()」将会是等效的。目前,这两者之间存在一些差异,尤其是在开启或关闭「#![no_std]」时 。

7.保留的语法

为了将来为某些新语法腾出空间,我们决定为前缀的标识符和文字保留语法:「prefix#identifier」,「prefix"string"」,「prefix'c'」和「prefix#123」,其中「prefix」可以是任何标识符(除了那些已经具有含义的,例如「b'…'」和「r"…"」)。

这是一个重大变化,因为宏会接受「hello"world"」,并视其为两个单独的标记:「hello」和「"world"」。解决方法很简单,只需插入一个空格:「hello "world"」

这些是可能会看到的一些新前缀:

「f""」是格式字符串的简写形式。例如,「f"hello {name}"」是等效的「format_args!()」调用的简写形式。

「c""」或「z""」用于空终止的C字符串。

「k#keyword」允许编写当前版本中尚不存在的关键字。例如,虽然「async」在2015版中不是关键字,但是该前缀将允许在2015版中以「k#async」作为替代。

8. 新的硬错误

在Rust 2021中,现有的两个lint会被视为硬错误,在旧版本中,这些lint将仍然是警告。

「bare-trait-objects」:在Rust 2021中,必须使用「dyn」关键字标识特征对象。

「ellipsis-inclusive-range-patterns」:Rust 2021不再接受过时的「...」语法,取而代之的是「.. =」,不过表达式的使用是一样的。

9. 「micro_rules」中的or

从1.53.0开始,便加入了对「|」的支持,使其可以嵌套在任何地方。例如,现在可以写「Some(1 | 2)」,而不需要使用「Some(1) | Some(2)」这种方式。

这个改动会对「macro_rules」宏产生影响,于是在1.53.0中「:pat」并不与「|」相匹配。因为之前,并非在所有嵌套级别都可以包含「|」。

不过,在Rust 2021中,「:pat」片段说明符将匹配「A | B」。

由于有时仍然希望匹配不带「|」的单个模式变量,因此添加了指定的片段「:pat_param」以保留旧的行为。 

 

责任编辑:张燕妮 来源: 新智元
相关推荐

2016-07-27 10:28:43

编程Python框架

2022-03-25 09:57:18

C++Rust语言

2015-04-14 14:23:38

苹果Swift编程语言

2020-07-03 08:00:19

编程语言JavaPython

2013-11-29 10:04:00

JavaScript远程办公

2015-06-17 14:06:50

编程语言计算机编程语言

2020-07-21 11:15:20

编程Rust开发

2023-09-17 23:01:39

Python编程语言

2021-03-02 08:40:38

区块链编程语言开发

2017-12-29 16:51:44

2021-03-07 09:01:05

编程语言开发

2020-10-18 12:01:52

编程语言JavaPython

2021-04-13 10:14:12

编程语言PythonJava

2018-01-11 17:22:20

PHP大数据开发

2020-02-25 17:49:39

编程语言框架

2019-11-19 16:07:24

Java编程语言JavaScript

2018-09-06 12:30:40

编程语言PythonJava

2020-06-17 10:08:08

编程数据库开发

2020-11-03 09:14:30

编程语言Go技术

2018-11-28 15:17:50

点赞
收藏

51CTO技术栈公众号