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

2311rust到20版本更新

Rust1.9

Rust1.9中最大的变化是稳定了包括停止恐慌启动的展开过程方法的std::panic模块:

use std::panic;
let result = panic::catch_unwind(|| {println!("hello!");
});
assert!(result.is_ok());
let result = panic::catch_unwind(|| {panic!("oh no!");
});
assert!(result.is_err());

1,已添加追加方法到BinaryHeap,BTreeMapBTreeSet中.此外,已添加split_offBTreeMap,因此BTreeSet::split_off.
2,在libstdf32f64类型上,有to_degreesto_radians方法,但现在它们也在libcore中.
3,Iterator有两个新方法:sumproduct
4,CellRefCell都有了get_mut.
5,与assert!一样,assert_eq!接受自定义错误消息.

?号

Rust获得了个新的?符号,假设有从文件中读取一些数据:

fn read_username_from_file() -> Result<String, io::Error> {let f = File::open("username.txt");let mut f = match f {Ok(file) => file,Err(e) => return Err(e),};let mut s = String::new();match f.read_to_string(&mut s) {Ok(_) => Ok(s),Err(e) => Err(e),}
}

此代码两条可能失败路径,即打开文件,及从中读取数据.如果其中一个不管用,想从read_username_from_file返回错误.

这里,涉及匹配I/O操作结果.但是,都是样板.
?,上面代码如下:

fn read_username_from_file() -> Result<String, io::Error> {let mut f = File::open("username.txt")?;let mut s = String::new();f.read_to_string(&mut s)?;Ok(s)
}

这是简写.即?针对Result值,如果它是Ok,则解包它并给出内部值.如果是Err,则从你当前所在的函数返回.

1.13之前,read_username_from_file可这样实现:

fn read_username_from_file() -> Result<String, io::Error> {let mut f = try!(File::open("username.txt"));let mut s = String::new();try!(f.read_to_string(&mut s));Ok(s)
}

多次调用try时,非常没有吸引力;要用更甜蜜的语法.!是连续使用的.考虑:

try!(try!(try!(foo()).bar()).baz())
//对比
foo()?.bar()?.baz()?

1.15.1稳定版

此版本修复了两个问题,即新vec::IntoIter::as_mut_slice方法中的健全性错误,及Rust发布版的某些C组件未使用-fPIC编译的回归问题.

as_mut_slice是个三行函数,在发布Rust1.15.0几分钟后就发现了该问题,提醒人们编写不安全代码的危险.
as_mut_sliceVec类型的IntoIter迭代器上的一个方法,它提供了正在迭代缓冲可变视图.从概念上讲,它很简单:只需返回缓冲引用;
事实上,实现很简单,但它是不安全的,因为IntoIter是用缓冲不安全指针实现的:

pub fn as_mut_slice(&self) -> &mut [T] {unsafe {slice::from_raw_parts_mut(self.ptr as *mut T, self.len())}
}

此方法带共享引用,且不安全地从可变引用继承.即as_mut_slice可生成同一缓冲多个可变引用,这是在Rust中是禁止的.

下面说明该错误:

fn main() {let v = vec![0];let v_iter = v.into_iter();let slice1: &mut [_] = v_iter.as_mut_slice();let slice2: &mut [_] = v_iter.as_mut_slice();slice1[0] = 1;slice2[0] = 2;
}

这里slice1slice2引用了同一个可变切片.注意,v_iter迭代器未按可变声明,很可疑.
修复很简单,只需将&self更改为&mut self:

pub fn as_mut_slice(&mut self) -> &mut [T] {unsafe {slice::from_raw_parts_mut(self.ptr as *mut T, self.len())}
}

这样,可保持唯一可变,且必须声明v_iter可变切片才能可变切片.

1.17.0稳定版

"静态生命期"现在假定为静态和常量.这样编写conststatic时:

const NAME: &'static str = "Ferris";
static NAME: &'static str = "Ferris";

Rust1.17允许省略"",因为这是唯一有意义的生命期:

const NAME: &str = "Ferris";
static NAME: &str = "Ferris";

有时,可删除大量样板:

//老
const NAMES: &'static [&'static str; 2] = &["Ferris", "Bors"];
//新增功能
const NAMES: &[&str; 2] = &["Ferris", "Bors"];

另一个类似改进叫"对象字面属性速记",在声明结构时可删除重复项,如下:

//定义
struct Point {x: i32,y: i32,
}
let x = 5;
let y = 6;
//老
let p = Point {x: x,y: y,
};
//新增功能
let p = Point {x,y,
};

也即,x,y形式假定设置其值为域中同名变量.
新手容易,把两个&strs在一起.这不管用,只能String+&str.因此.

//代码
"foo" + "bar"
//旧
error[E0369]: binary operation `+` cannot be applied to type `&'static str`--> <anon>:2:5|
2 |     "foo" + "bar"|     ^^^^^|
note: an implementation of `std::ops::Add` might be missing for `&'static str`--> <anon>:2:5|
2 |     "foo" + "bar"|     ^^^^^
//新加功能
error[E0369]: binary operation `+` cannot be applied to type `&'static str`--> <anon>:2:5|
2 |     "foo" + "bar"|     ^^^^^|= note: `+` can't be used to concatenate two `&str` strings

help:to_owned()可从创建"物主串"

引用.把连接到右侧的串
可能需要重新分配.这需要串的所有权

  |     "foo".to_owned() + "bar"

使用Cargo的构建脚本时,必须在Cargo.toml中设置脚本位置.然而,绝大多数人都写为build="build.rs",在项目的根目录中使用build.rs文件.

此约定现在已编码到Cargo中,如果存在build.rs,则假定此约定.可用build=false选出.

扩展了一点pub关键字.

pub(crate) bar;

()里面是"限制位",补充如何公开.上例一样使用crate关键字,表明bar对整个crate但不是在它之外,是公开的.

这样可更轻松地声明"对crate公开"但不向用户公开的API.
还可指定路径,如下:

pub(in a::b::c) foo;

即仅在a::b::c的层次中可用,其他地方不可用.
窗口用户,Rust1.18.0有个新属性,#![windows_subsystem].工作原理如下:

#![windows_subsystem = "console"]
#![windows_subsystem = "windows"]

控制链接器中的/SUBSYSTEM标志.目前,仅支持"控制台"和"窗口".

最后,Rust(没有#[repr])的元组,枚举变体字段和结构总是有个未限定的布局.开启了自动重排功能,可减少填充来减小尺寸.考虑此结构:

struct Suboptimal(u8, u16, u8);

x86_64平台上的Rust早期版本中,此结构的大小为6个字节.但查看源码,会期望有四个字节.额外的两个字节用来填充;

但是,如果像这样呢

struct Optimal(u8, u8, u16);

Rust1.19.0

第一个支持的版本:

union MyUnion {f1: u32,f2: f32,
}

类似枚举,但它们没有"标签"的.枚举有运行时决定存储哪个变体的"标签";省略了该标签.
因为可用错误变体解释联中保存数据,而Rust无法检查这一点,即读写联字段是不安全的:

let u = MyUnion { f1: 1 };
unsafe { u.f1 = 5 };
let value = unsafe { u.f1 };

模式匹配也有效:

fn f(u: MyUnion) {unsafe {match u {MyUnion { f1: 10 } => { println!("ten"); }MyUnion { f2 } => { println!("{}", f2); }}}
}

主要用来与C互操作.
循环现在可中断一个值:

//旧代码
let x;
loop {x = 7;break;
}
//新代码
let x = loop { break 7; };

不抓环境的闭包现在可转换为函数指针:

let f: fn(i32) -> i32 = |x| x + 1;

1.20.0稳定版

以前Rust版本中,已可定义有"关联函数"特征,结构和枚举:

struct Struct;
impl Struct {fn foo() {println!("foo是构的关联函数");}
}
fn main() {Struct::foo();
}

还增加了定义"关联常量"的功能:

struct Struct;
impl Struct {const ID: u32 = 0;
}
fn main() {println!("id为: {}", Struct::ID);
}

也即,常量IDStruct相关联.与函数一样,关联常量也适合特征和枚举.
特征,可像使用关联类型一样使用关联常量:声明它,但不给它一个值.
然后,特征实现者在实现声明其值:

trait Trait {const ID: u32;
}
struct Struct;
impl Trait for Struct {const ID: u32 = 5;
}
fn main() {println!("{}", Struct::ID);
}

此版本之前,必须如下写:

trait Float {fn nan() -> Self;fn infinity() -> Self;...
}

这有点笨拙,且因为是函数,即使只返回一个常量,也不能在常量式中使用它们.因此,Float的设计还必须包含常量:

mod f32 {const NAN: f32 = 0.0f32 / 0.0f32;const INFINITY: f32 = 1.0f32 / 0.0f32;impl Float for f32 {fn nan() -> Self {f32::NAN}fn infinity() -> Self {f32::INFINITY}}
}

通过关联常量,可更简洁地如下定义特征:

trait Float {const NAN: Self;const INFINITY: Self;...
}

实现:

mod f32 {impl Float for f32 {const NAN: f32 = 0.0f32 / 0.0f32;const INFINITY: f32 = 1.0f32 / 0.0f32;}
}

更干净,更通用.
还修复了include!文档测试中的:
首先,改了一些字面.考虑如下代码:

let x = &5;

Rust中,这段代码等价:

let _x = 5;
let x = &_x;

也即,这里在中存储,或可能在寄存器中存储5.x是引用它.

但是,因为它是个整数字面,因此不必是局部的.考虑,有个带静态参数的函数,如std::thread::spawn.可这样使用x:

use std::thread;
fn main() {let x = &5;thread::spawn(move || {println!("{}", x);});
}

在以前的Rust版本中,这无法编译:

error[E0597]: borrowed value does not live long enough--> src/main.rs:4:14|
4  |     let x = &5;|              ^ does not live long enough
...
10 | }| - temporary value only lives until here|注意:借入的值必须在`静态`生命期内有效...

因为5是局部的,所以它的借用也是局部的,这不符合生成要求.

但是,如果在Rust1.21上编译它,它将起作用.为什么?好吧,如果可把引用数据放入中,可化简为如下let x=&5;:

static FIVE: i32 = 5;
let x = &FIVE;

在此,因为FIVE静态的,因此x是&'静态 i32.

现在生成代码时并行运行LLVM.

1.22.01.22.1稳定版

现在可用Option<T>!
Rust1.22中,Option<T>现在是稳定的.此代码现在编译:

fn add_one_to_first(list: &[u8]) -> Option<u8> {//如果存在,取第一个元素,如果不存在,则返回`None`let first = list.get(0)?;Some(first + 1)
}
assert_eq!(add_one_to_first(&[10, 20, 30]), Some(11));
assert_eq!(add_one_to_first(&[]), None);

现在允许在conststatic项中,实现Drop的类型如下:

struct Foo {a: u32,
}
impl Drop for Foo {fn drop(&mut self) {}
}
const F: Foo = Foo { a: 0 };
static S: Foo = Foo { a: 0 };
//常/静

会增强常和静功能.
现在T op=&T适合原语类型:

let mut x = 2;
let y = &8;
//以前不行,但现在可以了
x += y;

以前,需要写x+=*y才能解引用.
1,Box<Error>现在隐含From<Cow<str>>
2,std::mem::Discriminant现在保证为发送+同步
3,fs::copy现在返回NTFS上主流的长度.
4,正确检测Instant+=Duration中的溢出.
5,impl Hasher for {&mutHasher,Box<Hasher>}
6,impl fmt::Debug for SplitWhitespace.

相关文章:

2311rust到20版本更新

Rust1.9 Rust1.9中最大的变化是稳定了包括停止恐慌启动的展开过程方法的std::panic模块: use std::panic; let result panic::catch_unwind(|| {println!("hello!"); }); assert!(result.is_ok()); let result panic::catch_unwind(|| {panic!("oh no!"…...

基于Spring、SpringMVC、MyBatis的漫画网站

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于Spring、SpringMVC、MyBatis的漫画网…...

MySQL数据库八股文

MySQL数据库八股文 第一章 数据库基础 1. 数据库概念 数据库是存储数据的仓库&#xff0c;数据库管理系统是操纵和管理数据库的大型软件&#xff08;如MySQL&#xff0c;InnoDB是其默认的存储引擎&#xff09;&#xff0c;SQL是操作关系型数据库的编程语言。 2. SQL语法与分…...

利用WebSocket +MQ发送紧急订单消息,并在客户端收到消息的用户的页面自动刷新列表

背景&#xff1a;在原有通知公告的基础上&#xff0c;把通知公共的推送服务修改为其他业务收到紧急订单发送公告到消息队列MQ&#xff0c;然后在js中创建一个socket去监听公告&#xff0c;收到公告后刷新所有在订单页面的用户的页面列表&#xff08;重点就是用户在收到紧急订单…...

R语言——taxize(第一部分)

ropensci 系列之 taxize &#xff08;中译手册&#xff09; taxize 包1. taxize支持的网络数据源简介目前支持的API&#xff1a;针对Catalogue of Life&#xff08;COL&#xff09; 2. 浅尝 taxize 的一些使用例子2.1. **从NCBI上获取唯一的分类标识符**2.2. **获取分类信息**2…...

【Spring Cloud】黑马头条 用户服务创建、登录功能实现

点击去看上一篇 一、创建用户 model 1.创建用户数据库库 leadnews_user 核心表 ap_user 建库建表语句 这里一定要使用 navicat&#xff0c;执行SQL 文件&#xff0c;以防止 cmd 中的编码问题 先将 SQL 语句&#xff0c;保存在电脑中&#xff0c;再使用 navicat 打开 CREATE…...

聚观早报 |英伟达发布H200;夸克发布自研大模型

【聚观365】11月15日消息 英伟达发布H200 夸克发布自研大模型 iQOO 12系列开启销售 红魔9 Pro配置细节 禾赛科技第三季度营收4.5亿元 英伟达发布H200 全球市值最高的芯片制造商英伟达公司&#xff0c;正在升级其H100人工智能处理器&#xff0c;为这款产品增加更多功能&am…...

15项基本SCADA技术技能

1. 人机界面 人机界面是将操作员连接到设备、系统或机器的仪表板或用户界面。 以下是 hmi 在 scada 技术人员简历中的使用方式&#xff1a; 完成了查尔斯湖废水处理厂和提升站的完整 HMI 图形界面。对加油系统、加油车、PLC、HMI、触摸屏进行故障排除和维修。对 Horner HMI …...

Golang 发送邮件

Go 有内置好的本地库可以发送邮件&#xff0c;在 GitHub 上也有别人写好的第三方包可以发送邮件。 本文将分别介绍一下这两种发送邮件的方式。 1、内置的net/smtp 为了更好的模拟发送邮件&#xff0c;推荐一个邮件测试工具&#xff1a;MailHog&#xff0c;MailHog 是面向开发…...

【ARM Trace32(劳特巴赫) 使用介绍 5-- Trace32 通过 JTAG 命令获取数据寄存器 IDCODE的值】

请阅读【ARM Coresight SoC-400/SoC-600 专栏导读】 文章目录 Trace JTAG Command LineTrace32 JTAG 数据发送命令Trace32 JTAG 数据接收命令Trace32 数据访问修饰符Trace32 IDCODE 脚本实例Trace32 APITrace JTAG Command Line Trace32 JTAG 数据发送命令 JTAG.SHIFTTMS <…...

Python之while/for,continue/break

定义一个随机数&#xff1a; import random numrandom.randint(1,10) while循环&#xff1a; while 条件(): 条件满足时&#xff0c;做的事情1 条件满足时&#xff0c;做的事情2 ...... for循环&#xff1a; for 变量 in range(10): 循环需要执行的代码 else: 循环结束时&…...

卷积神经网络(CNN)衣服图像分类的实现

文章目录 前期工作1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;我的环境&#xff1a; 2. 导入数据3.归一化4.调整图片格式5. 可视化 二、构建CNN网络模型三、编译模型四、训练模型五、预测六、模型评估 前期工作 1. 设置GPU&#xff08;如果使用的是CPU可以…...

odoo16前端框架源码阅读——env.js

env.js&#xff08;env的初始化以及服务的加载&#xff09; 路径&#xff1a;addons\web\static\src\env.js 这个文件的作用就是初始化env&#xff0c;主要是加载所有的服务。如orm, title, dialog等。 1、env.js 的加载时机 前文我们讲过前端的启动函数&#xff0c;start.…...

浙大恩特客户资源管理系统 SQL注入漏洞复现

0x01 产品简介 浙大恩特客户资源管理系统是一款针对企业客户资源管理的软件产品。该系统旨在帮助企业高效地管理和利用客户资源&#xff0c;提升销售和市场营销的效果。 0x02 漏洞概述 浙大恩特客户资源管理系统中T0140_editAction.entweb接口处存在SQL注入漏洞&#xff0c;未…...

ESP32网络开发实例-BME280传感器数据保存到InfluxDB时序数据库

BME280传感器数据保存到InfluxDB时序数据库 文章目录 BME280传感器数据保存到InfluxDB时序数据库1、BM280和InfluxDB介绍2、软件准备3、硬件准备4、代码实现在本文中,将详细介绍如何将BME280传感器数据上传到InfluxDB中,方便后期数据处理。 1、BM280和InfluxDB介绍 InfluxDB…...

C++中sort()函数的greater<int>()参数

目录 1 基础知识2 模板3 工程化 1 基础知识 sort()函数中的greater<int>()参数表示将容器内的元素降序排列。不填此参数&#xff0c;默认表示升序排列。 vector<int> a {1,2,3}; sort(a.begin(), a.end(), greater<int>()); //将a降序排列 sort(a.begin()…...

2024有哪些免费的mac苹果电脑内存清理工具?

在我们日常使用苹果电脑的过程中&#xff0c;随着时间的推移&#xff0c;可能会发现设备的速度变慢了&#xff0c;甚至出现卡顿的现象。其中一个常见的原因就是程序占用内存过多&#xff0c;导致系统无法高效地运行。那么&#xff0c;苹果电脑内存怎么清理呢&#xff1f;本文将…...

线性表的概念

目录 1.什么叫线性表2.区分线性表的题 1.什么叫线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串… 线性表在逻辑上是…...

锐捷练习-ospf虚链路及rip路由相互引入

一、相关知识补充 1、ospf基本概述 OSPF&#xff08;Open Shortest Path First&#xff09;是一种链路状态路由协议&#xff0c;用于在计算机网络中进行路由选择。它是内部网关协议&#xff08;IGP&#xff09;之一&#xff0c;常用于大规模企业网络或互联网服务提供商的网络…...

【机器学习】线性回归算法:原理、公式推导、损失函数、似然函数、梯度下降

1. 概念简述 线性回归是通过一个或多个自变量与因变量之间进行建模的回归分析&#xff0c;其特点为一个或多个称为回归系数的模型参数的线性组合。如下图所示&#xff0c;样本点为历史数据&#xff0c;回归曲线要能最贴切的模拟样本点的趋势&#xff0c;将误差降到最小。 2. 线…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

Xcode 16 集成 cocoapods 报错

基于 Xcode 16 新建工程项目&#xff0c;集成 cocoapods 执行 pod init 报错 ### Error RuntimeError - PBXGroup attempted to initialize an object with unknown ISA PBXFileSystemSynchronizedRootGroup from attributes: {"isa">"PBXFileSystemSynchro…...

k8s从入门到放弃之Pod的容器探针检测

k8s从入门到放弃之Pod的容器探针检测 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;容器探测是指kubelet对容器执行定期诊断的过程&#xff0c;以确保容器中的应用程序处于预期的状态。这些探测是保障应用健康和高可用性的重要机制。Kubernetes提供了两种种类型…...

设计模式-观察着模式

观察者模式 观察者模式 (Observer Pattern) 是一种行为型设计模式&#xff0c;它定义了对象之间一种一对多的依赖关系&#xff0c;当一个对象&#xff08;称为主题或可观察者&#xff09;的状态发生改变时&#xff0c;所有依赖于它的对象&#xff08;称为观察者&#xff09;都…...

2025年ESWA SCI1区TOP,自适应学习粒子群算法AEPSO+动态周期调节灰色模型,深度解析+性能实测

目录 1.摘要2.粒子群算法PSO原理3.改进策略4.结果展示5.参考文献6.代码获取7.算法辅导应用定制读者交流 1.摘要 能源数据的科学预测对于能源行业决策和国家经济发展具有重要意义&#xff0c;尤其是短期能源预测&#xff0c;其精度直接影响经济运行效率。为了更好地提高预测模型…...