Rust语言是一种高效可靠的通用高级语言,兼顾了开发效率和执行效率。除了能够执行对性能敏感的任务,Rust在内存和线程安全方面也具有极高的可靠性。在更新了1.52.1之后,Rust公布了2021版本的新计划:10月发布1.56。目前1.52.1版本主要针对增量编译导致的错误提供了一个临时解决方案:在Rust编译器中禁用增量编译(如果需要启用,设置环境变量RUSTC_FORCE_INCREMENTAL=1)。对于启用增量编译的场景,改进了新验证的诊断输出,指示如何通过清除增量状态或禁用增量来解决错误。用过的人都说:好香啊!你可能不知道,在stackoverflow的调查中,Rust已经连续五年被开发者评选为最流行的编程语言。许多知名的巨头已经将Rust语言添加到他们的项目中。Rust霸占用户最爱榜单,第二名无处可寻。Microsoft正在将Rust集成到大型项目中。大约70%的漏洞都与内存安全有关,因此寻求更安全的Rust来帮助它解决这个困扰它已久的问题。Facebook使用Rust在源代码控制后端进行代码重写。由于Rust可以在编译时检查出代码错误,有效减少了bug造成的经济损失。Dropbox使用Rust重写了文件同步引擎的代码。一个高并发的文件同步引擎的编写、测试和调试难度都很大,而Rust在静态类型和编译检查方面在使用上比Python性能更高。即使是Linux内核也将在5.14中添加对Rust的支持,毕竟C++很烂(不是我的,而是Linus)。“C++_没有_解决C的问题,只会让事情变得更糟。”网友们对即将到来的更新感到兴奋!“我等不及了。作为使用Python的人,我真的很想念混合变量的字符串的简单直观处理。”“所有版本将永远得到支持。这使得Rust2015代码和Rust2077的代码融合成为可能。”“感谢所有Rust志愿者,你们是最棒的!”2021年的更新计划是什么?1.什么是版本?Rust提出了一种不分裂生态系统的版本更新形式。向后不兼容的功能将作为新Rust版本的一部分包含在内。版本是可选的,因此除非现有的crate明确迁移到新版本,否则它们将看不到更改。一个版本中的crate可以与其他版本中编译的crate无缝互操作。无论版本如何,所有Rust代码最终都会在编译器中编译为相同的内部IR。版本的迁移也几乎是全自动的。新版本发布时,会附带一个自动迁移工具。除此之外,还有一个《版本迁移指南》指南,它既是发布的概述,也是遇到问题时的故障排除参考。迁移到旧版本时,需要进行一些小的代码更改。例如,迁移到Rust2018时,所有出现的“async”都将变为:“r#async”。2.prelude中的新内容Rust编译器将优先考虑手动导入的项目,因此prelude中添加的内容不会破坏任何现有代码。例如,名为“example”的crate或模块包含“pubstructOption;”,那么你可以使用“example::*;”使“选项”明确引用“示例”;而不是标准库。但是,向前奏中添加特征可能会破坏现有代码。例如,当使用“MyTryInto”特征调用“x.try_into()”时,如果“std”的“TryInto”也被导入,它将编译失败,因为它提供了一个同名的方法。作为解决方案,Rust2021将使用新的前奏,它添加了三个新函数:std::convert::TryInstd::convert::TryFromstd::iter::FromIterator3。自1.51起默认使用Cargo功能解析器。从0开始,Cargo已选择加入对新功能解析器的支持,可以通过“Cargo.toml”中的“resolver=”2“”激活。从Rust2021开始,这将是默认设置。换句话说,在“Cargo.toml”中写“edition=”2021“”意味着“resolver=”2”。4.数组迭代器IntoIterator在Rust1.53.0之前,“IntoIterator”只能用于数组引用。也就是说,“&[1,2,3]”和“&mut[1,2,3]”是可以遍历的,但是“[1,2,3]”是不能直接遍历的。for&ein&[1,2,3]{}//Ok:)forein[1,2,3]{}//错误:(团队在1.53.0之后的所有版本中添加了功能实现。在Rust2015和2018代码中,编译器仍会将“array.into_iter()”解析为“(&array).into_iter()”。这仅适用于“.into_iter()”调用语法,不会影响任何其他语法,例如“forein[1,2,3]","iter.zip([1,2,3])"或"IntoIterator::into_iter([1,2,3])"。5.捕获闭包代码块。例如,“||a.+1”自动从周围上下文中捕获对“a”的引用,而不仅仅是“a.x”。Leta=SomeStruct::new();drop(a.x);//Moveoutofonefieldofthestructprintln!("{}"ma.y);//OK:Stilluseanotherfieldofthestructletc=||println!("{}",a.y);//错误:Triestocaptureallof'a'c();当结构体的某个字段被借用或移除后,闭包中将不再使用其他字段,因为整个结构将因被捕获而变得不可用。从Rust2021开始,闭包将只捕获他们使用的字段。由于此更改会影响字段的删除顺序,因此目前仅在新版本中激活。如果你像以前一样捕获整个结构,你可以传入闭包“let_=&a;”在包里。对于其他版本,可以使用自动迁移,从而更新相关的关闭。6.Panic宏的一致性“panic!()”宏仅在使用多个参数String格式时调用。当使用单个参数调用时,它甚至不会查看该参数。leta="{";println!(a);//Error:Firstargumentmustbeaformatstringliteralpanic!(a);//Ok:Thepanicmacrodoesn'tcare隐式格式参数一旦确定,就会出问题。此时“println!("hello{name}")”就会变成“println!("hello{}",name)”的简写形式。但是"panic!("hello{name}")"将不起作用,因为"panic!()"不会将单个参数视为格式字符串。为避免这种情况,Rust2021提供了更一致的“panic!()”宏。新的“panic!()”宏将不再接受任意表达式作为唯一参数。相反,像“println!()”一样,始终将第一个参数视为格式字符串。这使得“panic_any()”成为“恐慌”除了格式字符串之外的任何东西的唯一方法。此外,Rust2021中的“core::panic!()”和“std::panic!()”将是等效的。目前,两者之间存在一些差异,尤其是在打开或关闭“#![no_std]”时。7.保留语法为了在未来为一些新语法腾出空间,我们决定为前缀标识符和文字保留语法:“prefix#identifier”、“prefix“string”、“prefix'c'”和“prefix#123”",其中“前缀”可以是任何标识符(除了那些已经具有含义的标识符,例如“b'...'”和“r”...”)。这是一个重大变化,因为宏将接受“hello“world””并将其视为两个单独的标记:“hello”和“world”。解决办法很简单,只需插入一个空格:“hello“world””这些是您可能会看到的一些新前缀:“f”“”是格式字符串的简写。例如,"f"hello{name}""是等效的"format_args!()"调用的简写。"c"""或"z"""表示以null结尾的C字符串。"k#keyword"允许写入当前版本中尚不存在的关键字。例如,尽管“async”在2015版本中不是关键字,但此前缀将允许在2015版本中使用“k#async”。8.新的硬错误在Rust2021中,现有的两个lints将被视为硬错误,而在旧版本中,这些lints仍将是警告。“bare-trait-objects”:在Rust2021中,必须使用“dyn”关键字来标识特征对象。“ellipsis-inclusive-range-patterns”:Rust2021不再接受过时的“...”语法,取而代之的是“..=”,但表达式的使用是一样的。9."micro_rules"中的or增加了对"|"的支持从1.53.0开始,它可以嵌套在任何地方。例如,您现在可以写“Some(1|2)”而不是“Some(1)|Some(2)”。此更改会影响“macro_rules”宏,因此“:pat”与“|”不匹配在1.53.0中。因为以前,'|'无法包含在所有嵌套级别中。但是,在Rust2021中,“:pat”片段说明符将匹配“A|B”。由于有时仍然希望匹配不带“|”的单个模式变量,因此添加了指定片段“:pat_param”以保留旧行为。
