Rust 1.38.0发行:流水线编译,#[不赞成使用]宏和std ::任何:: type_name

Rust开发团队很高兴地宣布发布新版本1.38.0。 Rust是一种编程语言,它使每个人都可以创建可靠而高效的软件。


如果您使用rustup安装了Rust的先前版本,那么要升级到1.38.0版本,您只需要运行以下命令:


rustup update stable 

如果尚未安装rustup,则可以从我们网站的相应页面进行安装


稳定版包含哪些内容?


此版本的重点是管道编译。


管道编译


编译器不需要完全组装的依赖关系来构建程序包,而只需在编译的早期阶段生成它们的“元数据”(类型,依赖关系,导出等的列表)即可。 从Rust 1.38.0开始,一旦其元数据可用,Cargo将立即开始构建依赖的软件包。


一个软件包的构建时间并没有减少, 但是我们的测试表明 ,在优化构建的情况下(其中一些依赖项已经被编译),编译速度提高了10%-20%。 对于其他软件包,编译速度没有发生很大的提高。 构建软件包所需的时间取决于计算机,因此性能可能会有所不同。 从1.38.0版开始自动启用管道编译。


检查mem::{uninitialized, zeroed}滥用


先前宣布的那样 ,不建议使用std::mem::uninitialized 。 而是应使用MaybeUninit<T>


mem::uninitialized函数尚未被弃用,但这将在以后的版本中完成。 但是尽管如此,从1.38.0开始,rustc使用mem::uninitializedmem::zeroed rustc检查一小类不正确的初始化。


对于某些类型,例如&TBox<T> ,空值被视为未定义行为,因为它们是类似指针的对象,不应为null 。 使用mem::uninitializedmem::zeroed初始化这些类型是错误的,因此,如果这些函数中的任何一个用于初始化上述对象,则编译器将尝试警告您,而无论是直接初始化还是将它们初始化为大型结构的领域。 此检查是递归的,因此以下代码需要警告:


 struct Wrap<T>(T); struct Outer(Wrap<Wrap<Wrap<Box<i32>>>>); struct CannotBeZero { outer: Outer, foo: i32, bar: f32 } ... let bad_value: CannotBeZero = unsafe { std::mem::uninitialized() }; 

细心的读者可能会注意到标准库包含更多不应填充零的类型,尤其是NonNull<T>NonZero<T> 。 到目前为止, 尚未验证使用mem::uninitializedmem::zeroed的这些结构的mem::uninitialized


这些检查并不涵盖不正确使用mem::uninitializedmem::zeroed MaybeUninit所有情况,但是允许您检测应保证会切换到MaybeUninit错误代码。


#[deprecated]巨集


#[deprecated]属性(最初在Rust 1.9.0中引入)允许程序包作者将计划在将来的版本中删除的过时功能通知用户。 Rust 1.38.0允许您将此属性应用于宏。


std::any::type_name


调试代码时可能需要使用所使用类型的字符串表示形式。 例如,在泛型函数的主体中,您可能需要打印传递的参数的类型。 现在std::any::type_name使用std::any::type_name


 fn gen_value<T: Default>() -> T { println!("Initializing an instance of {}", std::any::type_name::<T>()); Default::default() } fn main() { let _: i32 = gen_value(); let _: String = gen_value(); } 

结果:


 Initializing an instance of i32 Initializing an instance of alloc::string::String 

与标准库的所有功能(仅用于调试)一样,该功能不能保证字符串的确切内容和格式。 返回值是对该类型的最好描述; 多个类型可以由相同的type_name表示,但在以后的编译器版本中可能会更改。


对标准库的更改



此外,某些功能已稳定:



其他变化


语法货物包裹管理器Clippy分析器也进行了一些更改。


成员1.38.0


很多人一起创建了Rust 1.38.0。 没有你们大家,我们不可能做到这一点, 谢谢


来自翻译


如果您对Rust语言有任何疑问,他们将可以在俄语电报聊天对新手进行的类似聊天中为您提供帮助。


本文由andreevlexnlinkerfunkillGymmasssorla共同翻译。

Source: https://habr.com/ru/post/zh-CN469061/


All Articles