哈Ha! 我向您介绍了文章“ The Rust Release Team“宣布Rust 1.34.0”的翻译 。
Rust开发团队很高兴地宣布发布Rust的新版本1.34.0。 Rust是一种编程语言,使每个人都可以创建可靠且高效的软件。
如果您具有使用rustup安装的Rust的早期版本,那么只需将Rust升级到版本1.34.0,您只需执行以下操作:
$ rustup update stable
如果尚未安装rustup,则可以从我们网站的相应页面进行安装 。
稳定版1.34.0中包含什么
此版本的主要改进是对替代货物注册的支持。 该版本还包括支持?
在文档测试中,对#[attribute(...)]
和TryFrom
稳定性进行了一些改进。 阅读有关关键事项的信息,或查看详细的发行说明以获取更多信息。
替代cargo
登记
在1.0版之前,Rust有一个公共注册表crates.io 。 人们使用cargo publish
板条箱,并在Cargo.toml
的[dependencies]
部分中轻松连接这些板条箱。
但是,并非每个人都希望在crates.io上发布其包装箱。 支持封闭源代码项目的人员不能使用crates.io,而是必须在依赖项中指定git
或path
。 小型项目没有这样的东西,但是如果您的组织中有很多封闭的源板条箱,那么您将失去crates.io中提供的版本支持功能。
从此版本开始,Cargo可能支持替代注册表。 这些注册表与crates.io共存,因此您可以编写依赖于crates.io和注册表的程序。 但是,crates.io子机架不能依赖于外部注册表。
要使用替代注册表,必须.cargo/config
添加到.cargo/config
。 该文件可以位于您的主目录( ~/.cargo/config
)或程序包目录中。
[registries] my-registry = { index = "https://my-intranet:8080/git/index" }
从备用注册表添加依赖项很容易。 当您在Cargo.toml
指定依赖Cargo.toml
,请使用registry
项,以便Cargo知道您希望从备用注册表中接收板条箱:
[dependencies] other-crate = { version = "1.0", registry = "my-registry" }
作为板条箱的作者,如果要在其他注册表中发布板条箱,则需要做的第一件事是使用cargo login
命令将身份验证令牌保存在~/.cargo/credentials
:
cargo login --registry=my-registry
接下来,可以使用--registry
标志指定将在其中发布机架的注册表:
cargo publish --registry=my-registry
有关如何运行自己的注册表的信息,请参见文档 。
?
在文档测试中
RFC 1937是否建议增加操作员支持?
在fn main()
, #[test]
函数和文档测试,允许它们返回Option<T>
或Result<T, E>
,其中带错误的选项在fn main()
情况下导致非零终止代码,在测试情况下导致丢弃的测试。
对fn main()
和#[test]
已经实施了很长时间了 。 但是,文档测试的支持仅限fn main()
明确存在fn main()
测试。
在此版本中?
添加了全面支持?
在文档测试中。 现在,您可以在文档测试中编写以下内容:
在文档测试的底部,您仍然需要指出将要使用的错误类型。
支持用户属性中的自定义令牌流
Rust中的过程宏可以定义他们使用的用户属性。 到目前为止,根据以下语法,这些属性仅限于路径树和文字:
#[foo(bar)] #[foo = "bar"] #[foo = 0] #[foo(bar = true)] #[foo(bar, baz(quux, foo = "bar"))]
与程序宏不同,这些辅助属性不能接受定界符中的任意标记流,这就是为什么您不能编写#[range(0..10)]
或#[bound(T: MyTrait)]
。 相反,过程宏机架使用字符串来表示这种语法,例如#[range("0..10")]
。
在此版本中,自定义属性#[attr($tokens)]
允许在$tokens
使用任意$tokens
,并根据宏对其进行匹配。 如果您是程序宏板条箱的作者,请检查用户属性的语法中是否使用了字符串,以及是否可以用标记流替换它们。
TryFrom
和TryInto
TryFrom
和TryInto
已得到稳定,以支持类型转换错误。
例如, from_be_bytes
和相关的整数类型方法接收一个数组,但是数据通常是通过切片读取的。 切片和数组之间的手动转换很繁琐。 使用新特性,可以与.try_into()
在同一行上完成。
let num = u32::from_be_bytes(slice.try_into()?);
对于无法失败的转换,例如u8
到u32
,添加了Infallible
类型。 因此, TryFrom
自动为实现From
特性的所有内容实施TryFrom
。 将来,我们希望将Infallible
用作该 !
Infallible
别名 !
(从不) 。
不建议使用fn before_exec
使用unsafe fn pre_exec
在类似Unix的系统上, CommandExt::before_exec
允许您exec
调用exec
之前安排关闭。
在派生后在子进程的上下文中执行此关闭。 这意味着可以复制资源,例如文件描述符和内存区域。 换句话说,您可以在不同的过程中获得非Copy
类型值的副本,而原始副本将保留在父级中。 这可能导致不确定的行为,并破坏暗示没有重复的库 。
因此,必须将before_exec
函数标记为unsafe
。 在此版本中,我们将fn before_exec
标记为不推荐使用,而建议使用unsafe fn pre_exec
。 调用CommandExt::pre_exec
需要通过创建无效的重复项来确保闭包不违反库不变式。 如果您提供的库与before_exec
处于类似情况,请考虑过时并提供unsafe
的替代方法。
图书馆稳定
在1.34.0中,扩展了稳定的原子整数有符号和无符号类型的集合,从8位( AtomicU8
)开始到64位结束。
NonZeroU8
无符号整数(例如NonZeroU8
) 以前已稳定。 因此, Option<NonZeroU8>
与u8
大小相同。 此版本中NonZeroI8
稳定了诸如NonZeroI8
签名版本。
iter::from_fn
和iter::successors
函数的功能iter::successors
稳定。 第一个允许您从FnMut() -> Option<T>
创建迭代器。 要迭代地从向量中检索元素,现在可以编写from_fn(|| vec.pop())
。 同时,第二个函数创建一个新的迭代器,其中每个下一个元素都是根据前一个元素进行计算的。
此外,以下API已得到稳定:
有关更多详细信息,请参见详细的发行说明 。