济宁做网站比较好的公司有哪些,重庆建设工程安全监督信息网官网,网络策划需要哪些技能,wordpress搭建镜像1.76.0稳定版
此版本较小
ABI兼容更新
函数指针文档中新增的ABI兼容部分介绍了函数签名与ABI兼容的意义.大部分是参数类型和返回类型的兼容,及在当前Rust中兼容的列表.文档仅描述现有兼容的状态.
一个新增功能是,现在保证符和u32是ABI兼容的.它们一直有相同大小和对齐方式,…1.76.0稳定版
此版本较小
ABI兼容更新
函数指针文档中新增的ABI兼容部分介绍了函数签名与ABI兼容的意义.大部分是参数类型和返回类型的兼容,及在当前Rust中兼容的列表.文档仅描述现有兼容的状态.
一个新增功能是,现在保证符和u32是ABI兼容的.它们一直有相同大小和对齐方式,但现在即使在调用函数的ABI中,与上面文档一致,它们也是等价的.
引用中的类型名
为了调试,从Rust1.38开始,就可用any::type_name::T()返回T类型的串描述,但这需要一个显式的类型参数. 指定该类型会有点难,尤其是对无法命名的类型(如闭包)或不透明的返回类型.
新的any::type_name_of_val(T)可从类型引用中取描述性名字.
fn get_iter() - impl IteratorItem 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::IntoIteri32,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_eqstd::hash::{DefaultHasher,RandomState}这些以前只能通过std::collections::hash_map取得.
1.77.0稳定版
此版本较小.
C串字面
Rust现在支持在static CStr内存类型中,扩展到按nul字节终止的串的的C串字面(cabc).这样更易编写与需要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配置文件(如,debug0)默认允许stripdebuginfo.
主要是因为(预编译的)标准库附带了调试信息,即即使本地编译没有显式请求调试信息,但静态链接的结果包含了标准库的调试信息. 需要调试信息的用户可用相关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_poison1.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 ImportantTraitA {}
fn use_my_trait(_: impl ImportantTraiti32) {}
fn main() {use_my_trait(String::new());
}以前,编译器会给出如下内置错误: 错误[E0277]:不满足String:ImportantTraiti32的特征约束. –src/main.rs:12:18 | 12|use_my_trait(String::new()); |------------^^^^^^^^^^^^^未为串实现ImportantTraiti32特征 |此调用引入的约束的必需.
使用#[diagnostic::on_unimplemented],其自定义消息填充主错误行,在源输出上放置其自定义标签.仍按帮助输出写入原标签,且也会写入自定义注解.
这些确切细节可能会变化. 错误[E0277]:未为串实现ImportantTraiti32的消息 –src/main.rs:12:18 | 12|use_my_trait(String::new()); |------------^^^^^^^^^^^^^我的标签 |由此调用引入的约束必需 帮助:未为串实现ImportantTraiti32特征 注:注1 注:注2
对特征作者来说,如果可提供更好的提示,而不仅是谈论缺失的实现自身,则该诊断会更有用.如,这是标准库中的删节示例:
#[diagnostic::on_unimplemented(message the size for values of type {Self} cannot be known at compilation time,label doesnt 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_BACKTRACE1环境变量运行以显示追踪追踪 线程导致非展开崩溃.中止.
确定性重新对齐
标准库有一些可改变指针和切片的对齐方式的函数,但是如果严格遵守他们的文档,它们以前有一些注意,这样,实际上难以依赖它们.
这些警告主要是为了对冲常求值,但,它们只对非常使用是稳定的.现在,他们承诺根据其实际输入,有一致的运行时行为.
pointer::align_offset计算,要按给定对齐更改指针需要的偏移.如果不行,它会返回usize::MAX,但以前允许总是返回usize::MAX,现在已删除该行为.
slice::align_to和slice::align_to_mut都按对齐的中间切片和剩余的未对齐的头和尾切片转换切片.
这些方法现在承诺返回尽量大的中间部分,而不是允许实现返回次优的,如按头片返回所有内容. 稳定的API 对多个std::error::Error,接受相关实现的非static生命期
impl Read for Stdin
MakeimplFd:AsFdimpltakeSized
implFromTryReserveErrorforio::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-gnullvmRust1.78的LLVM已升级到18版本,完成了已声明的针对x86-32和x86-64目标的u128/i128ABI更改.
1.79.0稳定版
内联常式
常{...}块现在在式位置上是稳定的,允许无需额外的声明(如,在特征上定义常项或关联的常)的,显式进入常环境.
与常项(const ITEM:......)不同,内联常可使用域内的泛型,并推导其类型而不是显式写出来,这样,对内联代码片特别有用.如,像此模式:
const EMPTY: OptionVecu8 None;
let foo [EMPTY; 100];
//可写作:
let foo [const { None }; 100];注意,这也适合泛型环境,以前要求带关联常的冗长特征声明:
fn create_none_arrayT, const N: usize() - [OptionT; N] {[const { None::T }; N]
}这样,代码更加简洁并易于阅读.
关联类型位置的约束
Rust1.79稳定了关联项的约束语法,这允许在其他约束内的关联类型位置中放置约束,即T:TraitAssoc:Bounds....
这样就不需要显式泛型类型来约束关联类型.
此功能允许在一些以前不可能或要施加额外,不必要的限制的地方,指定约束: where子句,在此,相当于将约束分割为两个(或多个),where子句. 如,where T:TraitAssoc:Bound等价于where T:Trait,T as Trait::Assoc:Bound.
1,超级特征,与where子句不同,使用特征时,通过新语法隐式指定约束.示例语法:
trait CopyIterator: IteratorItem: Copy {}2,关联类型项约束,允许约束与特征的关联类型关联的嵌套刚性投影.如,
trait Trait { type Assoc: Trait2Assoc2: Copy; }3,不透明类型约束(RPIT,TAIT),允许无需命名不透明类型,约束与不透明类型关联的关联类型.如,impl IteratorItem:Copy定义一个项为复制的迭代器,不必实际将该项叫约束.
扩展自动临时生命期
现在在匹配和如构造中,自动扩展在构造中立即引用的临时的生命期.这与块结构中扩展临时对象的生命期一样. 如:
let a if true {..;temp() //过去错误,但现在扩展了生命期
} else {..;temp() //过去错误,但现在扩展了生命期
};
//而
let a match () {_ {..;temp() //过去错误,但现在扩展了生命期}
};现在与之前行为一致:
let a {..;temp() //扩展生命期
};因为这些程序过去编译失败,此行为后向兼容.
在标准库构建中允许帧指针
标准库现在使用-Cforce-frame-pointersyes编译分发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::NonZeroT
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