当前位置: 首页 > article >正文

2411rust,76~79

1.76.0稳定版

此版本较小

ABI兼容更新

函数指针文档中新增的ABI兼容部分介绍了函数签名ABI兼容的意义.大部分是参数类型返回类型的兼容,及在当前Rust兼容的列表.文档仅描述现有兼容的状态.

一个新增功能是,现在保证u32ABI兼容的.它们一直有相同大小对齐方式,但现在即使在调用函数的ABI中,与上面文档一致,它们也是等价的.

引用中的类型名

为了调试,从Rust1.38开始,就可用any::type_name::<T>()返回T类型串描述,但这需要一个显式的类型参数.
指定该类型会有点难,尤其是对无法命名的类型(如闭包)或不透明的返回类型.

新的any::type_name_of_val(&T)可从类型引用中取描述性名字.

fn get_iter() -> impl Iterator<Item = i32> {
    [1, 2, 3].into_iter()
}
fn main() {
    let iter = get_iter();
    let iter_name = std::any::type_name_of_val(&iter);
    let sum: i32 = iter.sum();
    println!("The sum of the `{iter_name}` is {sum}.");
}

当前打印:
'core::array::iter::IntoIter<i32,3>'的和是6.

稳定的API

Arc::unwrap_or_clone
Rc::unwrap_or_clone
Result::inspect
Result::inspect_err
Option::inspect
type_name_of_val
ptr::{from_ref, from_mut}
ptr::addr_eq

std::hash::{DefaultHasher,RandomState}这些以前只能通过std::collections::hash_map取得.

1.77.0稳定版

此版本较小.

C串字面

Rust现在支持在&'static CStr内存类型中,扩展到按nul字节终止的串的的C串字面(c"abc").这样更易编写与需要nul结尾串的外部接口互操作的代码,并在编译时检查所有相关的错误(如,缺少内部nul字节).

支持异步fn中的递归

因为编译器限制,以前异步函数无法调用自身.在1.77中,已取消该限制,因此只要使用间接以避免无穷大小函数状态,就允许递归调用.
像此代码现在可以工作了:

async fn fib(n: u32) -> u32 {
   match n {
       0 | 1 => 1,
       _ => Box::pin(fib(n-1)).await + Box::pin(fib(n-2)).await
   }
}

offset_of!

构字段,1.77.0稳定了可访问结构的相关字段的字节偏移offset_of!.当在没有类型的现成实例,但需要字段的偏移时,此宏最有用.

用户现在可用offset_of!(StructName, field)访问字段的偏移,它从结构开头开始按字节用偏移扩展到usize式.

默认,在发布配置文件中允许去掉

未在输出中允许调试信息cargo配置文件(如,debug=0)默认允许strip="debuginfo".

主要是因为(预编译的)标准库附带了调试信息,即即使本地编译没有显式请求调试信息,但静态链接的结果包含了标准库的调试信息.
需要调试信息的用户可用相关Cargo配置文件中的调试标志显式允许它.

Stabilized APIs
array::each_ref
array::each_mut
core::net
f32::round_ties_even
f64::round_ties_even
mem::offset_of!
slice::first_chunk
slice::first_chunk_mut
slice::split_first_chunk
slice::split_first_chunk_mut
slice::last_chunk
slice::last_chunk_mut
slice::split_last_chunk
slice::split_last_chunk_mut
slice::chunk_by
slice::chunk_by_mut
Bound::map
File::create_new
Mutex::clear_poison
RwLock::clear_poison

1.78.0稳定版

诊断属性

Rust现在支持#[diagnostic]属性名字空间,来影响编译器错误消息.按不要求编译器用的提示对待这些,提供编译器无法识别诊断也不是错误.

该灵活性使得即使并非所有,无论是不同版本还是完全不同实现编译器,都支持它们,源码提供诊断.

名字空间带有第一个支持#[diagnostic::on_unimplemented]属性,需要该特征但尚未在类型上实现时,可在特征放置它以自定义消息.

考虑稳定化拉请给出的示例:

#[diagnostic::on_unimplemented(
    message = "My Message for `ImportantTrait<{A}>` is not implemented for `{Self}`",
    label = "My Label",
    note = "Note 1",
    note = "Note 2"
)]
trait ImportantTrait<A> {}
fn use_my_trait(_: impl ImportantTrait<i32>) {}
fn main() {
    use_my_trait(String::new());
}

以前,编译器会给出如下内置错误:
错误[E0277]:不满足'String:ImportantTrait<i32>'的特征约束.
–>src/main.rs:12:18
|
12|use_my_trait(String::new());
|------------^^^^^^^^^^^^^未为'串'实现'ImportantTrait<i32>'特征
|此调用引入的约束的必需.

使用#[diagnostic::on_unimplemented],其自定义消息填充主错误行,在源输出放置其自定义标签.仍按帮助输出写入原标签,且也会写入自定义注解.

这些确切细节可能会变化.
错误[E0277]:未为'串'实现'ImportantTrait<i32>'的消息
–>src/main.rs:12:18
|
12|use_my_trait(String::new());
|------------^^^^^^^^^^^^^我的标签
|由此调用引入的约束必需
=帮助:未为'串'实现'ImportantTrait<i32>'特征
=注:注1
=注:注2

特征作者来说,如果可提供更好的提示,而不仅是谈论缺失的实现自身,则该诊断更有用.如,这是标准库中的删节示例:

#[diagnostic::on_unimplemented(
    message = "the size for values of type `{Self}` cannot be known at compilation time",
    label = "doesn't have a size known at compiletime"
)]
pub trait Sized {}

断定不安全的前提条件

Rust标准库有许多不安全函数的前提条件的断定,但历史上它们只在标准库#[cfg(debug_assertions)]构建中允许,以避免影响发布性能.

然而,因为一般是在发布模式编译和分发标准库,因此大多数Rust开发者并不检查这些.

现在,延迟到生成代码,才执行这些断定的条件,因此根据用户自己的设置检查调试断定,在调试和测试构建中默认允许.

尽管检查的量的细节一般不稳定,此更改可帮助用户在其代码中抓未定义行为.

如,slice::from_raw_parts要求一个对齐非无效指针.以下故意的未对齐指针未定义行为,虽然如果你运气不佳,在过去可能"有效",但调试断定现在可以抓住它:

fn main() {
    let slice: &[u8] = &[1, 2, 3, 4, 5];
    let ptr = slice.as_ptr();
     //从对齐总是与`'u16'`的正确方式相差1个的`'针'`创建一个偏移
    let i = usize::from(ptr as usize & 1 == 0);
    let slice16: &[u16] = unsafe { std::slice::from_raw_parts(ptr.add(i).cast::<u16>(), 2) };
    dbg!(slice16);
}

library/core/src/panicking.rs:220:5'main'线程出现紧急情况:
违反了不安全的前提条件:slice::from_raw_parts要求指针对齐非无效,且切片的总大小不超过'isize::MAX'

注意:使用'RUST_BACKTRACE=1'环境变量运行以显示追踪追踪
线程导致非展开崩溃.中止.

确定性重新对齐

标准库有一些可改变指针切片对齐方式的函数,但是如果严格遵守他们的文档,它们以前有一些注意,这样,实际上难以依赖它们.

这些警告主要是为了对冲求值,但,它们只对非常使用是稳定的.现在,他们承诺根据其实际输入,有一致的运行时行为.

pointer::align_offset计算,要按给定对齐更改指针需要的偏移.如果不行,它会返回usize::MAX,但以前允许总是返回usize::MAX,现在已删除该行为.

slice::align_toslice::align_to_mut都按对齐中间切片剩余的未对齐尾切片转换切片.

这些方法现在承诺返回尽量大的中间部分,而不是允许实现返回次优的,如按头片返回所有内容.
稳定的API
对多个std::error::Error,接受相关实现非'static生命期

impl Read for &Stdin
Makeimpl<Fd:AsFd>impltakeSized
implFrom<TryReserveError>forio::Error

这些API现在在环境中是稳定的:
Barrier::new()

兼容说明

如前,Rust1.78已要求其最低提高到窗口10,以实现以下目标:

x86_64-pc-windows-msvc
i686-pc-windows-msvc
x86_64-pc-windows-gnu
i686-pc-windows-gnu
x86_64-pc-windows-gnullvm
i686-pc-windows-gnullvm

Rust1.78LLVM已升级到18版本,完成了已声明的针对x86-32x86-64目标的u128/i128ABI更改.

1.79.0稳定版

内联

常{...}块现在在式位置上是稳定的,允许无需额外的声明(如,在特征上定义项或关联的常)的,显式进入环境.

项(const ITEM:...=...)不同,内联可使用域内的泛型,并推导其类型而不是显式写出来,这样,对内联代码片特别有用.如,像此模式:

const EMPTY: Option<Vec<u8>> = None;
let foo = [EMPTY; 100];
//可写作:
let foo = [const { None }; 100];

注意,这也适合泛型环境,以前要求带关联常的冗长特征声明:

fn create_none_array<T, const N: usize>() -> [Option<T>; N] {
    [const { None::<T> }; N]
}

这样,代码更加简洁并易于阅读.

关联类型位置的约束

Rust1.79稳定了关联项约束语法,这允许在其他约束内的关联类型位置放置约束,即T:Trait<Assoc:Bounds...>.

这样就不需要显式泛型类型约束关联类型.

此功能允许在一些以前不可能或要施加额外,不必要的限制的地方,指定约束:
where子句,在此,相当于将约束分割为两个(或多个),where子句.
如,where T:Trait<Assoc:Bound>等价于where T:Trait,<T as Trait>::Assoc:Bound.

1,超级特征,与where子句不同,使用特征时,通过新语法隐式指定约束.示例语法:

trait CopyIterator: Iterator<Item: Copy> {}

2,关联类型项约束,允许约束特征关联类型关联的嵌套刚性投影.如,

trait Trait { type Assoc: Trait2<Assoc2: Copy>; }

3,不透明类型约束(RPIT,TAIT),允许无需命名不透明类型,约束与不透明类型关联的关联类型.如,impl Iterator<Item:Copy>定义一个复制迭代器,不必实际将该项约束.

扩展自动临时生命期

现在在匹配构造中,自动扩展构造立即引用临时的生命期.这与块结构扩展临时对象的生命期一样.
如:

let a = if true {
    ..;
    &temp() //过去错误,但现在扩展了生命期
} else {
    ..;
    &temp() //过去错误,但现在扩展了生命期
};
//而
let a = match () {
    _ => {
        ..;
        &temp() //过去错误,但现在扩展了生命期
    }
};

现在与之前行为一致:

let a = {
    ..;
    &temp() //扩展生命期
};

因为这些程序过去编译失败,此行为后向兼容.

在标准库构建中允许帧指针

标准库现在使用-Cforce-frame-pointers=yes编译分发Rust项,使下游用户可更轻松地分析他们的程序.注意,尽管在Cargo发布配置文件默认去掉它,标准库还继续提供了行级调试信息(如,DWARF).

稳定的API

{integer}::unchecked_add
{integer}::unchecked_mul
{integer}::unchecked_sub
<[T]>::split_at_unchecked
<[T]>::split_at_mut_unchecked
<[u8]>::utf8_chunks
str::Utf8Chunks
str::Utf8Chunk
<*const T>::is_aligned
<*mut T>::is_aligned
NonNull::is_aligned
<*const [T]>::len
<*mut [T]>::len
<*const [T]>::is_empty
<*mut [T]>::is_empty
NonNull::<[T]>::is_empty
CStr::count_bytes
io::Error::downcast
num::NonZero<T>
path::absolute
proc_macro::Literal::byte_character
proc_macro::Literal::c_string

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

Atomic*::into_inner
io::Cursor::new
io::Cursor::get_ref
io::Cursor::position
io::empty
io::repeat
io::sink
panic::Location::caller
panic::Location::file
panic::Location::line
panic::Location::column

http://www.kler.cn/a/403151.html

相关文章:

  • HarmonyOS笔记5:ArkUI框架的Navigation导航组件
  • 46并发编程(线程、进程)
  • iOS应用网络安全之HTTPS
  • 使用node-addon-api实现从c到nodejs模块全流程
  • SOL链上的 Meme 生态发展:从文化到创新的融合#dapp开发#
  • 私域四步走:打造你的专属流量池
  • 【Redis】持久化机制RDB与AOF
  • Makefile中的变量
  • 网络蠕虫病毒研究
  • Angular进阶之十一:从 Rxjs 获得的启发——改良方法传入参数的形式
  • Redis的过期删除策略和内存淘汰机制以及如何保证双写的一致性
  • C++面试基础知识:new vs malloc
  • 深入解析 Vue 3 中的 onShow 和 onHide 生命周期
  • 注解用于从 HTTP 请求中提取数据
  • 昇思MindSpore第四课---GPT实现情感分类
  • Ubuntu Linux使用前准备动作_使用root登录图形化界面
  • go-zero(五) 模板定制
  • Jquery实现jsonview
  • Java算法OJ(7)随机快速排序
  • vue3:scss引用
  • stm32————重映射基础知识点(PWM呼吸灯实验)
  • 模型压缩——训练后剪枝
  • windows安装redis, 修改自启动的redis服务的密码
  • Vue3 组件 view-shadcn-ui 2024.4.0 发布
  • 解决IntelliJ IDEA的Plugins无法访问Marketplace去下载插件
  • AWTK-WIDGET-WEB-VIEW 实现笔记 (2) - Windows