2510rs,rust,1.85
原文
1.85.0
稳定版
语言
1,RPIT
改变了生命期
抓规则,没有use<..>
时更改了impl Trait
类型的默认抓参数
.
2,if let
临时域,对iflet
式更改临时域
.
3,尾部式临时域
,更改块中尾部式
的临时域
.
4,匹配人体工程学保留
,禁止某些模式
组合以避免混淆
并允许未来改进.
5,不安全的外
块,外
块现在需要不安全
关键字.
6,不安全属性
,现在必须按不安全
标记export_name,link_section
和no_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_var
和std::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
,AsyncFnMut
和AsyncFnOnce
.
有时,已可用比如||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)
whereFut: 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
,更多细节
,见当前参考.
这里
这里
元组的FromIterator
和Extend
早期版本
的Rust
为(T,U
)元组对的迭代器
实现了方便特征
,使其行为类似Iterator::unzip
.
Extend
在1.56
中,FromIterator
在1.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