锈病计划2021版

2021-05-11 23:46:07

我们很高兴地宣布,第三版锈语,锈病2021,定于10月份发布。2021载有许多小变化,不可取的预计对实践中的生锈有何显着改善。

Rust 1.0的释放成立"没有停滞的稳定性"作为一个核心生锈可交付。然而,由于1.0版本以来,RUST的规则一旦发布了稳定,我们就会致力于支持这一点所有未来版本的功能。

然而,有时候,能够使能够制作不兼容的语言是有用的。最明显的示例是引入一个新的关键字,它会使相同名称的变量无效。例如,第一个版本Rust没有异步和等待关键词。在后面的版本中,可以将这些单词改变为关键字。像让异步= 1一样的破坏代码;

版本是我们用来解决这个问题的机制。当我们想要发布将释放一个否则不兼容的功能时,我们这样做是新的Rust Edition的一部分。调配是选择选择的,所以现有的板条箱Donot看到这些变化直到他们明确地迁移到新版本。这意味着即使选择了最新版本的Rust将不会将Async视为关键字,除非选择2018年或以后。这个选择是作为其货物的一部分制作。 Cargo New创建的新板条箱始终配置为使用最新的稳定版本。

版本最重要的规则是一个版本的箱子在一个版本中无缝地与其他版本编译的箱子无缝。这是迁移到较新版本的决定是A"私人One"父亲可以在不影响他人的情况下做出。

条箱互操作性的要求意味着我们可以在版本中进行的种类限制。在一般中,版本发生的变化往往是"皮肤深层"。所有的生锈代码,无论是版本如何,最终编译在编译器中的相同内部表示。

我们的目标是使箱子升级到新版本。当我们发布新版本时,我们还提供了自动化迁移的工具。它对所需的代码进行微小的更改,使其与新版本兼容。示例,当迁移到RUST 2018时,它将更改名为ASYNC的任何命名以使用等效的原始标识符语法:R#ASync。

自动迁移不一定是完美的:可能存在一些角落案例,其中仍然需要手动更改。工具尝试难以避免可能影响代码的正确性或性能的常长语义。

除了工具外,我们还维护了一个版本的迁移指南,涵盖了一个版本的变化。这指南将描述更改,并为人们可以了解更多有关它的地方。它还将涵盖任何角落案件或细节人们应该了解。指南既可以作为该版本的概述,也是一个快速故障排除,参考文章录入自动化工具问题。

在过去的几个月里,Rust 2021工作组通过许多建议在新版本中包含了许多建议。我们很高兴地宣布最终的版本更改列表.Ecte必须达到两个标准来制作此列表。首先,他们必须得到适当的铁锈团队的批准。第二手,他们的实施必须足够远,我们的哈希依靠,他们将及时完成计划的里程碑。

标准图书馆的初步是包含在每个模块中自动导入的所有内容的模块。它包含常用的项目,例如选项,Vec,Drop和Clone。

Rust编译器通过PRELUDE确定任何手动导入的项目,以确保添加PRELUDE不会破坏任何现有代码。例如,如果您有一个包含PUB结构选项的箱子或调用示例的箱子或模块;,则使用示例: :*;将使选项明确地引用示例中的选项;不是来自标准库的选项。

但是,向前奏添加特征可以以微妙的方式打破现有代码。使用MyTryInto特征的呼叫x.try_into()可能会变得模糊的安排,以编译Std'还导入了,因为它提供了具有相同名称的方法。这是我们哈比的原因' t补充了tryinto到prelude,因为有很多代码会破坏这种方式。

作为解决方案,Rust 2021将使用新的前奏。'''除了三个新增的添加之外:

由于生锈1.51.0,货物可以用Regarver =&#34的rescation激活来加入新功能resolver的支持。在货物上。

从Rust 2021开始,这将是默认值。那是,写作Edition =" 2021"在Cargo.Toml将意味着解析器=" 2"

新功能解析器不再合并所有请求的功能涉及多种方式依赖于依赖的。将Rest 1.51发布详细信息。

直到生锈1.53,只有对阵阵列的引用才能实现。这意味着您可以迭代& [1,2,3]和& mut [1,2,3],但不是直接[1,2,3]。

对于& e在& [1,2,3] {} //确定:)在[1,2,3] {} //错误中:(

这是一个长期存在的问题,但解决方案并不像似乎一样简单。只需添加特质实施即可破坏现有代码。 Array.Into_iter()已经在今天编译,因为它隐含地调用(& array).Into_iter()由于方法调用语法工作原因.Adding实现特征实现将改变含义。

通常,我们将这种类型的破损分类(添加了特征实施)'次要'并且可以接受。但在这种情况下,它有太多的代码将被它打破。

已经提出了许多时候到"只有在锈病2021&#34中的阵列实施到阵列;。但是,这根本是不可能的。你可以在一版本中存在特质实施,而不是在另一个版本中存在特质实施。由于版本可以混合。

相反,我们决定在所有版本中添加特征实施(从Rust 1.53.0开始),但添加一个小黑客以避免破损,直到Rust 2021.in Rust 2015和2018代码,编译器仍将解析array.into_iter()到(& array).Into_iter()如之前,好像不存在特性实现。这只适用于.into_iter()方法调用语法。它不会影响[1中的任何其他语法,如[1, 2,3],iter.zip([1,2,3])或中的INTILER ::进入ITER([1,2,3])。这些将开始在所有版本中工作。

虽然它' Sa羞耻,这需要一个小黑客来避免破损,我们很满意这个解决方案如何保持在Editions与绝对最小值之间的差异。Since Hack仅在那里出现在旧版中的旧版在新版本中没有增加复杂性。

闭彩捕获从他们的身体内所指的任何东西。例如,|| A + 1自动捕获到周围上下文的引用。

目前,这适用于整个结构,即使仅使用一个字段。对于示例,|| AX + 1捕获对A any的引用,而不仅仅是某些情况,这是一个问题。当结构的字段已经借用(可变地)或移出时,其他字段不能再用于封闭,由于这将捕获整个结构,因此不再可用。

让a = somestuct :: new();下降(a.x); //从Structprintln的一个字段中移动!(" {}}}" a.y); // OK:仍然使用Structlet C = ||的另一个字段println!(" {}}}" a.y); //错误:尝试捕获所有`a`c();

从Rust 2021开始,关闭只会捕获它们使用的字段。所以上面的示例将在Rust 2021中编译精细。

此新行为仅在新版本激活,因为它可以更改删除字段的顺序。对于所有版本更改,可以使用自动迁移,这将更新您的封闭功能。它可以插入_ =& a;在关闭内部,以迫使entorutuct以以前捕获。

恐慌!()宏是生锈'最着名的宏之一。但是,它有一些微妙的惊喜我们可以' t由于向后兼容性而变化。

恐慌!(" {}}" 1); //好的,用消息" 1"恐慌!(" {}}"); //好的,用消息和#34的恐慌; {}"

恐慌!()宏只使用字符串格式' s调用多个参数。用单个参数调用时,它甚至看起来甚至看那个论点。

让A =" {&#34 ;; println!(a); //错误:第一个参数必须是格式字符串Literalpanic!(a); //好:恐慌宏并在' t care

这将尤其是一个问题一旦隐式格式ArgumerSare稳定的问题。该功能将制作Println!(" hello {name}")一个简短的println!(" hello {}&#34 ;,姓名)。然而,恐慌!(" hello {name}")自恐慌!()不在处理单个参数作为格式字符串。

为避免这种令人困惑的情况,Rust 2021具有更一致的恐慌!()宏。新的恐慌!()宏将不再接受唯一的表达式作为唯一的Argument.it,就像println!(),始终处理第一个参数为格式字符串.SINCE PANIC!()将不再接受任意有效负载,Panic_Any()将是与格式化字符串以外的其他内容恐慌的唯一方法。

此外,核心::恐慌!()和std :: panic!()在锈病2021中会相同。当前,这两个之间存在一些历史差异,当切换#![no_std]打开或关闭时可以是显而易见的。

在将来的一些新语法中腾出空间,我们决定保留用于预混标识符和文字的语法:前缀#标识符,前缀"字符串&#34 ;,前缀' c'和前缀#123,前缀可以是任何标识符。(除了那些已经有意义的那些含义,例如B' ...'和R" ..." ...&#34 ;.)

这是一个破坏性的变化,因为宏目前可以接受你好"世界"他们将看到两个单独的代币:你好和"世界"。(自动)修复很简单。只需插入空间:Hello"世界"

除了将这些转换为令牌化错误之外,RFC不附加到任何前缀的含义。对于特定前缀的分配含义留给了未来的建议,这将感谢您现在的保留这些前缀 - 不是破坏更改。

F""作为格式字符串的陈词文。例如,f" hello {name}"作为等效Format_args的陈词滥调!()调用。

k#关键字允许在当前版本中编写不存在的关键字。例如,当Async不是Edition 2015中的关键字时,此前缀将'允许我们作为替代方案接受K#Async在2015年期间,我们等待2018年版以将Async保留为关键字。

两个现有的棉绒在锈病2021中变得艰难。这些棉绒将在旧版中保持警告。

裸露 - 物体:使用DYN关键字识别特质objectSwill在Rust 2021中是必需的。

省略号 - 包含范围模式:已弃用的...... rust 2021中不再接受包含范围模式的弃用......已经取代了.. =,它与表达式一致。

从RUST 1.53.0开始,模式延伸到支持|嵌套在图案中的任何地方。这使您可以写一些(1 | 2)而不是一些(1)|一些(2)。在之前,这是不允许的,这不是一个破坏的变化。

但是,此更改也会影响Macro_rules Macros.such宏可以接受使用:Pat片段说明符接受模式.Currently,:Pat不匹配|,自生锈1.53之前,并非所有模式(在所有嵌套级别)都可能包含a | .macros接受像a的模式b,如匹配!()使用类似$($ _:pat)| +。因为我们不想打破任何现有的宏,我们没有改变含义:PAT在RAST 1.53.0中包括|。

相反,我们将作为Rust 2021的一部分进行更改。在新版本中,:Pat片段说明符将匹配a | B.

由于有多次仍希望匹配单个图案variant而没有|,指定的片段:Pat_Param已添加到保留旧的行为。该名称是指其主要用例:闭合参数中的模式。

我们的计划是将这些变化合并并在9月份进行了完全测试,以确保2021版使其变成生锈1.56.0.rust 1.56.0然后将在六周内进行六周,之后将在10月份稳定发布21。

但请注意,Rust是由志愿者运行的项目。我们优先考虑努力研究Rustover的个人幸福,我们可能已经置的截止日期和期望。这可能意味着必要时延迟版本,或删除转动的功能 在时间结束时太困难或压力。 也就是说,我们按照时间表,并且许多困难的问题已经解决了,因为所有人都有贡献2021的所有人! 💛 您可以预期关于新版本的新版本。该点我们预期所有更改和自动迁移都可以实现和准备公开测试。 我们' ll会发布有关该过程的更多细节,并拒绝在&#34的提案;里面生锈" 博客很快。

2021-5-11 4:47
2021-5-10 23:6
2021-5-8 22:42