原文

1.85.0稳定版

语言

1,RPIT改变了生命期抓规则,没有use<..>时更改了impl Trait类型的默认抓参数.
2,if let临时域,对iflet更改临时域.
3,尾部式临时域,更改块中尾部式临时域.

4,匹配人体工程学保留,禁止某些模式组合以避免混淆并允许未来改进.

5,不安全的块,块现在需要不安全关键字.
6,不安全属性,现在必须按不安全标记export_name,link_sectionno_mangle属性.

7,unsafe_op_in_unsafe_fn警告,unsafe_op_in_unsafe_fnlint现在默认发出警告,要求在不安全函数中显式的unsafe{}块.

8,禁止引用静态 mut,引用静态mut项的现在会生成默认拒绝错误.

9,永不类型回退更改,更改了永不类型!强制,并按"拒绝"更改never_type_fallback_flowing_into_unsafe检查级.

10,宏片段限定符,macro_rules!宏现在也匹配_式.

11,缺少宏片段限定符,missing_fragment_specifierlint现在是一个拒绝不带片段限定符类型宏元变量硬错误.

12,gen关键字,保留gen关键字,以备未来添加生成器块.
13,保留语法,保留#"foo"#风格串和##令牌,以期未来更改保护串字面的解析方式.

标准库

1,更改预加载,在预加载中添加未来IntoFuture.
2,为Box<[T]>添加IntoIterator,更改迭代器处理装箱切片的方式.
3,新不安全的函数,std::env::set_var,std::env::remove_varstd::os::unix::process::CommandExt::before_exec现在是不安全的函数.

货物

1,Cargo:Rust版本相关解析器,更改默认依赖解析器行为以考虑rust版本字段.
2,Cargo:表和键名一致性,删除一些过时的Cargo.toml键.

3,Cargo:拒绝未使用的继承的默认功能,更改与继承的客户区依赖的defaultfeatures=false工作方式.

Rustdoc

1,Rustdoc组合测试,现在在一个可执行文件中组合了Doctest,显著提高了性能.
2,Rustdoc嵌套了包含!更改,更改嵌套包含!文件的相对路径行为.

Rustfmt

1,Rustfmt:风格版,引入了允许你独立控制Rust版的格式化版本"风格版"的概念.
2,Rustfmt:格式化修复,大量修复各种情况的格式化.

3,Rustfmt:排序原始标识,更改了r#foo标识的排序方式.
4,Rustfmt:版本排序,更改包含整数的标识排序方式.

异步闭包

Rust现在支持异步闭包,如async||{}在调用时返回未来.这与一个也可从本地环境中抓值的异步 fn一样,与普通闭包函数之间的区别一样.

还在标准库预加载中带了3个类似的特征:AsyncFn,AsyncFnMutAsyncFnOnce.

有时,已可用比如||async{}普通闭包和异步块来近似它,然而,无法从闭包抓中借用此内部块返回的未来,但这确实适合异步闭包:

let mut vec: Vec<String> = vec![];
let closure = async || {
    vec.push(ready(String::from("")).await);
};

也无法用返回未来Fn特征,正确表达高阶函数签名,但你可用AsyncFn特征来编写它:

use core::future::Future;
async fn f<Fut>(_: impl for<'a> Fn(&'a u8) -> Fut)
where
    Fut: Future<Output = ()>,
{ todo!() }
async fn f2(_: impl for<'a> AsyncFn(&'a u8))
{ todo!() }
async fn main() {
    async fn g(_: &u8) { todo!() }
    f(g).await;
    //~^错误不匹配类型
    //~|错误:一个类型比另一个类型更通用
    f2(g).await;
    //好
}

因此,异步闭包为这两个问题提供了一流的方法!更多细节,见RFC3668和稳定报告.
这里
这里

从诊断中隐藏特征实现

新的#[diagnostic::do_not_recommend]属性是编译器提示,以不要按诊断消息的一部分显示带注解的特征实现.

库作者来说,这是个避免编译器给出可能无益或误导性的建议的方法.如:

pub trait Foo {}
pub trait Bar {}
impl<T: Foo> Bar for T {}
struct MyType;
fn main() {
    let _object: &dyn Bar = &MyType;
}

对某些API,实现间接通过该空实现可能很有意义.对别人来说,可能期望大多数用户应该直接实现,因此的建议有问题.

此时,添加诊断提示将如下更改错误消息:

#[diagnostic::do_not_recommend]
impl<T: Foo> Bar for T {}

有关原始动机,见RFC2397,更多细节,见当前参考.
这里
这里

元组的FromIteratorExtend

早期版本Rust为(T,U)元组对的迭代器实现了方便特征,使其行为类似Iterator::unzip.
Extend1.56中,FromIterator1.79中.

这些现在已扩展到更多的元组长度,从单例(T,)12个项目长度(T1,T2,..,T11,T12).如,你现在可用collect()一次扇出到多个集合中:

use std::collections::{LinkedList, VecDeque};
fn main() {
    let (squares, cubes, tesseracts): (Vec<_>, VecDeque<_>, LinkedList<_>) =
        (0i32..10).map(|i| (i * i, i.pow(3), i.pow(4))).collect();
    println!("{squares:?}");
    println!("{cubes:?}");
    println!("{tesseracts:?}");
}
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
[0, 1, 8, 27, 64, 125, 216, 343, 512, 729]
[0, 1, 16, 81, 256, 625, 1296, 2401, 4096, 6561]

更新到std::env::home_dir()

std::env::home_dir(),已弃用多年,因为如果设置了HOME环境变量(这不是窗口上的正常配置),它可能会在某些窗口配置中产生奇怪的结果.
之前避免更改其行为,因为担心与基于该非标准配置的代码的兼容.因此函数,已弃用的时间,现在按错误修复更新它的行为,后续版本将删除该函数弃用.

稳定的API

BuildHasherDefault::new
ptr::fn_addr_eq
io::ErrorKind::QuotaExceeded
io::ErrorKind::CrossesDevices
{float}::midpoint
正的 {integer}::midpoint
NonZeroU*::midpoint
impl std::iter::Extend
//对1~12个参数的元组实现
FromIterator<(A, ...)>
//对1~12个参数的元组实现

std::task::Waker::noop

这些API现在在环境中是稳定的:

mem::size_of_val
mem::align_of_val
Layout::for_value
Layout::align_to
Layout::pad_to_align
Layout::extend
Layout::array
std::mem::swap
std::ptr::swap
NonNull::new
HashMap::with_hasher
HashSet::with_hasher
BuildHasherDefault::new
<float>::recip
<float>::to_degrees
<float>::to_radians
<float>::max
<float>::min
<float>::clamp
<float>::abs
<float>::signum
<float>::copysign
MaybeUninit::write
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐