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

2311rust,到50版本更新

1.46.0稳定版

改进const fn

现在,可在const fn中使用几个核心语言功能:
1,if,ifletmatch
2,while,whileletloop
3,&&||符号
4,还可转换切片:

const fn foo() {
  let x = [1, 2, 3, 4, 5];
  //转换`数组`为切片
  let y: &[_] = &x;
}

虽然这些功能并不新鲜,但可在const fn之外使用它们,增加了大量编译时计算能力!如,const-sha1仓库可让你编译时计算SHA-1哈希值.

这导致微软RustWinRT绑定性能提高了40倍.

#[track_caller]

该属性叫#[track_caller],最初是在2017年7月的RFC2091中提出的!如果正在编写一个像unwrap这样可能会崩溃的函数,可在函数上加此注解,默认的panic格式化会在其错误消息位置使用其调用者.
如,这是先前的unwrap:

pub fn unwrap(self) -> T {
    match self {
        Some(val) => val,
        None => panic!("called `Option::unwrap()` on a `None` value"),
    }
}

现在像这样:

#[track_caller]
pub fn unwrap(self) -> T {
    同上...
}

就是这样!
如果自己实现恐慌(panic)勾挂,则可用std::panic::Location上的调用者方法来访问此信息.

更改库

std::mem::forget现在是const fn.此外,此版本还稳定了两个新API:

Option::zip
vec::Drain::as_slice

1.47.0稳定版

大数组上的特征

Rust目前无法在整数值上泛型.
因为无法泛型N,所以必须要为每个N的数组手动实现特征.
如果试在Rust1.46上:

fn main() {
    let xs = [0; 34];
    println!("{:?}", xs);
}

会收到错误.
但在Rust1.47中,它会打印出正确的数组.

更短的追踪

Rust1.47.0中,已修复.该程序:

fn main() {
    panic!();
}

更容易地看到恐慌实际起源,如果想看到所有内容,你仍可设置RUST_BACKTRACE=full.

窗口上的控制流防护

rustc现在支持-C control-flow-guard,该选项在窗口上,打开控制流这里保护.其他平台忽略此标志.

更改库

此外,此版本还稳定了9个新API:

Ident::new_raw
Range::is_empty
RangeInclusive::is_empty
Result::as_deref
Result::as_deref_mut
Vec::leak
pointer::offset_from
f32::TAU
f64::TAU

以下以前稳定API现已成为常量:
1,所有非零(NonZero)整数的新(new)方法.
2,所有整数的checked_add,checked_sub,checked_mul,checked_neg,checked_shl,checked_shr,saturating_add,saturating_subsaturating_mul方法.
3,所有有符号整数checked_abs,saturating_abs,saturating_negsignum.
4,charu8is_ascii_alphabetic,is_ascii_uppercase,is_ascii_lowercase,is_ascii_alphanumeric,is_ascii_digit,is_ascii_hexdigit,is_ascii_punctuation,is_ascii_graphic,is_ascii_whitespaceis_ascii_control方法.

1.48.0稳定版

rustdoc中更容易链接

RustdocRust发布版中包含的库文档工具,可让你用Markdown编写文档.
假设正在为一些Rust代码编写一些文档,如下:

pub mod foo {
    pub struct Foo;
}
pub mod bar {
    pub struct Bar;
}

两个模块,每个模块内部都有个结构.但想同时使用这两个结构;要在文档中记录这一点.因此,如下编写一些文档:

pub mod foo {
    /// `Foo`文档
    ///
    pub struct Foo;
}

pub mod bar {
    /// `Bar`文档
    ///
    pub struct Bar;
}

一切正常,但如果可链接其他类型,就太好了.这样可更容易在文档间访问.
问题是MarkdownRustrustdoc生成的URL一无所知.因此,Rust必须手写.

该版本中,可用一些语法让rustdoc知道你正在试链接一个类型,让它为你生成URL.下面是基于之前代码的两个不同示例:

pub mod foo {
    /// `Foo`文档及[`Bar`](crate::bar::Bar)
    pub struct Foo;
}

pub mod bar {
    /// `Bar`文档,及[`crate::foo::Foo`]
    pub struct Bar;
}

第一例生成Bar类型的正确链接.第二个链接到Foo,但会将整个crate::foo::Foo显示为链接文本.更多

添加搜索别名

现在,可通过rustdocUI搜索时,在项目上指定#[doc(alias="<alias>")],以添加搜索别名.这是一个较小的更改,但仍有用.像这样:

#[doc(alias = "bar")]
struct Foo;

有了该注解,如果在rustdoc的搜索中搜索"bar",即使搜索文本中没有"Foo",也会把Foo当作结果的一部分而出现.
别名还用在,每个Rust函数都可别名到它所包装的C函数FFI包装仓库.然后,底层C库现有用户可轻松搜索正确的Rust函数!

更改库

最重要的API更改类似:[T;N]:TryFrom<Vec<T>>现在是稳定的.可用它来试把向量变成定长数组:

use std::convert::TryInto;
let v1: Vec<u32> = vec![1, 2, 3];
//这将成功,向量长度为`3`,正在试生成长度为3的数组.
let a1: [u32; 3] = v1.try_into().expect("wrong length");
//但是,如果试使用长度为5的向量来完成......
let v2: Vec<u32> = vec![1, 2, 3, 4, 5];
//...这会恐慌,因为长度错误.
let a2: [u32; 3] = v2.try_into().expect("wrong length");

此外,此版本还稳定了五个新API:

slice::as_ptr_range
slice::as_mut_ptr_range
VecDeque::make_contiguous
future::pending
future::ready

以下以前稳定的API现已成为常量:

Option::is_some
Option::is_none
Option::as_ref
Result::is_ok
Result::is_err
Result::as_ref
Ordering::reverse
Ordering::then

1.49.0稳定版

64ARMLinux达到第1层

Rust编译器支持各种目标,但Rust团队无法为所有这些目标提供相同级别支持.为了清楚标记支持程度,使用分层系统:

编译器在技术上支持第3层目标,但不会检查其代码是否生成或通过测试,且发布时不提供预构建二进制文件.
第2层目标可保证构建,且提供预构建的二进制文件,但不会在这些平台上执行测试包:生成的二进制文件可能无法工作或有错误.
第1层目标提供最高支持保证.
Rust1.49.0提升aarch64-unknown-linux-gnu目标为第1层支持,为运行Linux64ARM系统的用户带来最高保证!

这一变化使从嵌入式到台式机和服务器的工作负载受益.
这是该项目一个重要里程碑,因为这是非x86目标首次达到第1层支持.
注意,Android不受此更改影响,因为它使用不同的第2层目标.

测试框架抓线程中的输出

Rust内置测试框架没有太多功能,这里改进了!

#[test]
fn thready_pass() {
    println!("fee");
    std::thread::spawn(|| {
        println!("fie");
        println!("foe");
    })
    .join()
    .unwrap();
    println!("fum");
}

测试运行程序确保抓输出,并在测试失败时保存它.

更改库

Rust1.49.0中,有三个新的稳定函数:

slice::select_nth_unstable
slice::select_nth_unstable_by
slice::select_nth_unstable_by_key
And two functions were made const:
Poll::is_ready
Poll::is_pending

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

相关文章:

  • 使用Python编写一个简单的网页爬虫,从网站抓取标题和内容。
  • 跨平台WPF框架Avalonia教程 一
  • 【计算机网络】水平触发与边缘触发有什么优缺点呢?
  • 阿里云引领智算集群网络架构的新一轮变革
  • 【开源免费】基于SpringBoot+Vue.JS购物推荐网站(JAVA毕业设计)
  • RabbitMQ的工作队列在Spring Boot中实现(详解常⽤的⼯作模式)
  • uniapp app tabbar 页面默认隐藏
  • Android studio2022.3项目中,底部导航菜单数多于3个时,只有当前菜单显示文本,其他非选中菜单不显示文本
  • UI自动化测试(弹出框,多窗口)
  • linux进程间通信之信号
  • text/xml和application/xml
  • Pytorch torch.norm函数详解用法
  • 【系统稳定性】1.5 黑屏(二)
  • Python中的实例属性和类属性
  • Word中NoteExpress不显示的问题
  • C语言测试题:用冒泡法对输入的10个字符由小到大排序 ,要求数组做为函数参数。
  • 流量分析(5.5信息安全铁人三项赛数据赛题解)
  • 一些nginx命令
  • 【机器学习】决策树算法理论:算法原理、信息熵、信息增益、预剪枝、后剪枝、算法选择
  • 键鼠自动化2.0展示
  • php连接sqlserver 安装sqlserver 驱动windows系统
  • C++ 继承和派生
  • VIM去掉utf-8 bom头
  • 软件安利——火绒安全
  • 【C++11】线程库
  • 【算法萌新闯力扣】:找到所有数组中消失对数字