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,BTreeMap
和BTreeSet
中.此外,已添加split_off
到BTreeMap
,因此BTreeSet::split_off
.
2,在libstd
的f32
和f64
类型上,有to_degrees
和to_radians
方法,但现在它们也在libcore
中.
3,Iterator
有两个新方法:sum
和product
4,Cell
和RefCell
都有了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_slice
是Vec
类型的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;
}
这里slice1
和slice2
都引用
了同一个可变
切片.注意,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
稳定版
"静态生命期
"现在假定为静态和常量
.这样编写const
或static
时:
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);
}
也即,常量ID
与Struct
相关联.与函数一样,关联常量
也适合特征和枚举
.
对特征
,可像使用关联类型
一样使用关联常量
:声明它,但不给它一个值.
然后,特征
实现者在实现
时声明
其值:
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.0
和1.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);
现在允许在const
和static
项中,实现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. 数据库概念 数据库是存储数据的仓库,数据库管理系统是操纵和管理数据库的大型软件(如MySQL,InnoDB是其默认的存储引擎),SQL是操作关系型数据库的编程语言。 2. SQL语法与分…...
利用WebSocket +MQ发送紧急订单消息,并在客户端收到消息的用户的页面自动刷新列表
背景:在原有通知公告的基础上,把通知公共的推送服务修改为其他业务收到紧急订单发送公告到消息队列MQ,然后在js中创建一个socket去监听公告,收到公告后刷新所有在订单页面的用户的页面列表(重点就是用户在收到紧急订单…...

R语言——taxize(第一部分)
ropensci 系列之 taxize (中译手册) taxize 包1. taxize支持的网络数据源简介目前支持的API:针对Catalogue of Life(COL) 2. 浅尝 taxize 的一些使用例子2.1. **从NCBI上获取唯一的分类标识符**2.2. **获取分类信息**2…...

【Spring Cloud】黑马头条 用户服务创建、登录功能实现
点击去看上一篇 一、创建用户 model 1.创建用户数据库库 leadnews_user 核心表 ap_user 建库建表语句 这里一定要使用 navicat,执行SQL 文件,以防止 cmd 中的编码问题 先将 SQL 语句,保存在电脑中,再使用 navicat 打开 CREATE…...

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

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

Golang 发送邮件
Go 有内置好的本地库可以发送邮件,在 GitHub 上也有别人写好的第三方包可以发送邮件。 本文将分别介绍一下这两种发送邮件的方式。 1、内置的net/smtp 为了更好的模拟发送邮件,推荐一个邮件测试工具:MailHog,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
定义一个随机数: import random numrandom.randint(1,10) while循环: while 条件(): 条件满足时,做的事情1 条件满足时,做的事情2 ...... for循环: for 变量 in range(10): 循环需要执行的代码 else: 循环结束时&…...

卷积神经网络(CNN)衣服图像分类的实现
文章目录 前期工作1. 设置GPU(如果使用的是CPU可以忽略这步)我的环境: 2. 导入数据3.归一化4.调整图片格式5. 可视化 二、构建CNN网络模型三、编译模型四、训练模型五、预测六、模型评估 前期工作 1. 设置GPU(如果使用的是CPU可以…...
odoo16前端框架源码阅读——env.js
env.js(env的初始化以及服务的加载) 路径:addons\web\static\src\env.js 这个文件的作用就是初始化env,主要是加载所有的服务。如orm, title, dialog等。 1、env.js 的加载时机 前文我们讲过前端的启动函数,start.…...

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

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>()参数表示将容器内的元素降序排列。不填此参数,默认表示升序排列。 vector<int> a {1,2,3}; sort(a.begin(), a.end(), greater<int>()); //将a降序排列 sort(a.begin()…...

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

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

锐捷练习-ospf虚链路及rip路由相互引入
一、相关知识补充 1、ospf基本概述 OSPF(Open Shortest Path First)是一种链路状态路由协议,用于在计算机网络中进行路由选择。它是内部网关协议(IGP)之一,常用于大规模企业网络或互联网服务提供商的网络…...
【机器学习】线性回归算法:原理、公式推导、损失函数、似然函数、梯度下降
1. 概念简述 线性回归是通过一个或多个自变量与因变量之间进行建模的回归分析,其特点为一个或多个称为回归系数的模型参数的线性组合。如下图所示,样本点为历史数据,回归曲线要能最贴切的模拟样本点的趋势,将误差降到最小。 2. 线…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...

练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...