生锈1.51.

2021-03-26 19:45:21

锈队很乐意宣布新版Rust,1.51.0。 Rust是一种专动图的语言,它能够赋予每个人来构建可靠的更丰富的软件。

如果您有通过Rustup安装的先前版本的RUDE,则rust1.51.0可以简单:

如果您已将其'它已经存在,您可以在我们的网站上提供保险箱,并在GitHub上查看1.51.0的详细发行说明。

此版本代表了锈语言和货物的最大补充之一,在很长一段时间内,稳定了Const Generics的MVP和货物的新功能解析器。让'潜入潜水!

在此版本之前,RUDE允许您使用寿命或类型的参数化类型。例如,如果我们想要在数组的元素类型上泛型的结构,我们' d写下以下内容:

结构固定阵列< t> {// ^^^键入通用定义列表:[t; 32] // ^我们'重新使用它。}

如果我们然后使用固定阵列< u8>,编译器将制作一个单声道的固定阵列,看起来像:

这是一个功能强大的功能,允许您编写没有运行时开销的可重用代码。但是,直到此版本,它已在这些类型的值上容易地通用。这在阵列中最值得注意的是它们在其类型定义中的长度([t; n]),这之前您不能泛型。现在有1.51.0,您可以编写通过任何整数,BOOL或CHAR类型的值的泛型代码! (使用struct或枚举值仍然不稳定。)

此更改现在让我们拥有自己的数组结构,它的类型和它的类型是通用的。让' s看一个示例定义,以及如何使用它。

结构阵列< t,const length:measize> {// ^^^^^^^^^^^^^^^^^^^^^^^ const generic定义。列表:[T;长度] // ^^^^^^我们在这里使用它。}

现在,如果我们使用阵列< u8,32>,编译器将制作一个看起来的数组的单声道版本:

Const Generics为库设计师添加了一个重要的新工具,以创建新的强大的编译时间安全API。如果你喜欢了解更多关于Const Generics的更多信息,您也可以查看" Const Generics MVP HITS Beta"博客帖子有关该功能及其当前限制的更多信息。我们可以等待查看您创造的新图书馆和API!

作为Const Geacerics稳定的一部分,我们也稳定使用它的新API,STD :: Array :: Intor。 Inist允许您在任何数组上通过value迭代器创建一个。以前有没有一种方便的方法来迭代数组的拥有价值,只引用它们。

fn main(){let array = [1,2,3,4,5]; //以前用于array.ITER()中的项目。复制(){println!(" {}}",项目); } //现在在std :: array :: initer :: new(array){println!(" {}}",项目); }}

请注意,这将添加为单独的方法而不是阵列上的.Into_iter(),因为目前介绍了一定量的断裂;目前.Into_iter()是指切片旁参考迭代器。我们'重新探索未来使这种更符合人体工程学的方法。

依赖管理是一个难题,它的最困难的部分之一是恰好挑选在它' s依赖于两个不同的包时使用的依赖性。这不包括其版本号,还包括它的版本号,还有哪些功能和#39; t' t为包启用。货物' s默认行为是在依赖图中的多次引用时合并单个包的功能。

例如,假设您有一个名为foo的依赖性a和b,它被包装吧和baz使用,但是栏依赖于foo + a,并且Baz取决于foo + b。货物将合并这些功能,并将foo作为foo + ab编译。这有一个好处,你只需要编译一个foo,然后它可以重复使用栏和baz。

但是,这也有一个缺点。如果在构建依赖关系中启用的功能与您正在构建的目标不兼容,那么

生态系统中的一个常见示例是在许多#![no_std]箱中包含的可选std功能,允许箱子在标准下提供额外的功能。现在想象一下你想在你的#![no_std]二进制文件中使用#![no_std]版本,并在构建时使用foo .rs。如果您的构建时间依赖性取决于Foo + STD,则您的二进制型现在也取决于Foo + STD,这意味着它将不再编译,因为STD不适用于您的目标平台。

这在货物中是一个长期存在的问题,并在此释放出来的释放'是您的货物中的一个新的解析器选项.Toml,您可以在其中设置Resolver =" 2"告诉货物尝试解决功能的新方法。您可以查看RFC 2957以了解行为的详细说明,可以如下汇总。

dev依赖关系 - 当程序包作为正常依赖项和开发依赖性时,只有当前构建包括开发依赖性,才会启用开发依赖性功能。

主机依赖项 - 当程序包作为正常依赖项和构建依赖项或proc-宏共享时,对正常依赖关系的功能保持独立于构建依赖性或proc-宏。

目标依赖 - 当包在构建图中多次出现多次时,其中一个实例是目标特定依赖项,那么如果目前正在构建目标,则仅启用目标特定依赖项的功能。

虽然这可以导致一些不止一次编译的箱子,但这应该在使用货物的功能时提供更直观的开发经验。如果你' d想了解更多,你也可以阅读"特征解析器"有关更多信息的货物书籍部分。我们喜欢感谢货物团队和所有参与他们在设计和实施新的解析程序的所有辛勤工作的人!

虽然在发布中不经常突出显示,但防锈队不断努力改善生锈'在编译时段,这一版本标志着麦克斯锈病的最大改进之一。调试信息将二进制代码映射回源代码,以便该程序可以为您提供有关运行时出现问题的更多信息。在MacOS中,先前使用名为dsymutil的工具收集到单个.dsym文件夹中的调试信息。这可能需要一些时间并使用相当多的磁盘空间。

将所有DebugInfo收集到此目录中有助于在运行时查找它,特别是如果在移动二进制文件时。但是,它确实有缺点,即使您对您的程序进行小的更改时,Dsymutil也需要在整个最终二进制文件中运行以产生最终的.dsym文件夹。这有时可以为构建时间添加很多,特别是对于较大的项目,因为所有依赖性总是被回忆,但这是一个必要的一步,因为没有它生锈' s标准图书馆没有知道如何加载调试摩托斯的信息。

最近,Rust Backtrets切换到使用不同的后端,支持加载debuginfo,而无需运行dsymutil,我们' ve稳定的支持跳过dsymutil运行。这可以显着加速包括DebugInfo的构建,并显着减少所使用的磁盘空间量。我们哈比' t运行广泛的基准,但已经看到了很多人的报告'在麦斯斯的情况下,在麦斯斯的速度越来越大。

您可以通过在运行rustc时设置-csplit-debuginfo =未包装标志来启用此新行为,或通过设置拆分 - debuginfo [profile]选项在货物中解压缩。 "未包装和#34;选项指示RUSTC将.o对象文件留在构建输出目录中,而不是删除它们,并跳过运行dsymutil的步骤。 Rust' s回溯支持足以知道如何找到这些.o文件。 LLDB等工具也知道如何执行此操作。这应该只有在保留调试信息的同时需要将二进制文件移动到不同的位置。

总的来说,该释放稳定为18种新方法,可以为各种类型和偷窥。一个值得注意的添加是稳定PTR :: ADDR_OF!和ptr :: addr_of_mut!,允许您将原始指针创建为未对齐的字段。以前这不是可能的,因为Rust需要& /& um; um; um;&& addr为* const _然后导致未定义的行为与& addr需要对齐。这两个宏现在让您安全创建未对齐的指针。

使用std :: ptr;#一个未预定的参考,因此是未定义的行为!LET RAW_F2 = PTR :: ADDR_OF!(packed.f2); assert_eq!(不安全{raw_f2.read_unaligned(),2);

Rust 1.51.0发布中还有其他更改:查看Rust,Cargo和Clippy中的改变。

很多人聚集在一起创造生锈1.51.0。我们无法完成它,没有你们。谢谢!