Rust笔记【1】

  1. 元组和解构语法
let tup : (i32, f64, u8) = (666, 2.0, 1);let tup = (666, 2.0, 1);
let (x, y, z) = tup;let x = tup.0;
let y = tup.1;
let z = tup.2;
  1. 数组类型
    数组定义是方括号:[ ]
    元组定义是小圆括号:( )
    结构体定义是大括号:{ },结构体定义和赋值中,成员用逗号,分隔(c++中使用分号分隔)
let arr = [1, 2, 3];
let sss = ["mon", "tue", "fri"];let a: [i32; 5]; # 长度为5的整型数组
let b: [3; 5];	# 53let data = a[0];
  1. 传参、赋值默认都是移动操作。
  2. 引用不移动所有权,默认引用是不可修改的。例如:
let s = String::from("hello");func(&s);fn func(str: &string) -> ...
  1. 可变引用:
    如果创建了变量的一个可变引用,就不能再创建对改变量的其他引用(包括可变、不可变引用)。
    在一个作用域内不能有多个可变引用,在不同的作用域、不同时创建多个可变引用。
    如果已经创建一个或多个不可变引用,则不能再创建可变引用。
let mut s = String::from("hello");func(&mut s);fn func(str: &mut String) ->...
  1. 引用的个数:
    在一个作用域内:
    1)有一个或多个不变引用,无可变引用。
    2)只有一个可变引用。

注意:作用域结束不是以大括号结束,是以变量最后一次使用结束变量作用域(是没有显式标志)。
例如:

let mut s = String::from("hello");
let r1 = &s; // 没问题
let r2 = &s; // 没问题
println!("{} and {}", r1, r2);
// 此位置之后r1 和r2 不再使用let r3 = &mut s; // 没问题
println!("{}", r3);
  1. slice是一类引用,引用集合中一段连续的元素序列。
    关键字: 引用,集合,连续片段

字符串slice:

let slice_name = target_set[start_index .. end_index]let s = String::from("hello world");
let h = &s[0..5];
let w = &s[6..11];# 以下几个等效
let h1 = &s[..5]; 
let w = &s[6..];
let s2 = &s[..];

字符串slice类型声明:&str

fn func(s: &String) -> &str { ...

字符串字面值是slice
s类型是&str

let s = "hello world";
  1. 结构体
    如果存储引用,则必须指定生命周期。否则编译错误。
struct Rectangle {width: i32,height: i32,
}# 实例化,不需要new,key: value方式赋值。
let retc = Rectangle {width: 10,height: 20,
}
  1. 类单元结构体 unit-like struct
    用于在某个类型上实现trait,不存储数据
# 不需要大括号定义成员
struct SomeTrait;# 实例化,不需要括号,没有成员需要赋值
let obj = SomeTrait;
  1. 结构体更新语法
    用一个已有结构体实例为另一个结构体赋值,新结构体只改变部分成员的值
struct User {a: i32,b: i32,c: i32,
}let u1 = User {a: 1,b: 2,c: 3,
};# ..u1(u1为已有结构体实例)必须放到最后
# 除明确复制的字段(b),其他字段值使用u1实例的
# 结构体更新语法,移动了数据,对于不支持copy trait的类型,更新后,原实例对象不可用。
let u2 = u1 {b: 99,..u1,
}
  1. 元组结构体
    为元组指定名称,单独的成员不指定名称。有整体名称,无成员变量名称。
    介于元组(无整体名称,无成员变量名称)和结构体(有整体名称,有成员变量名称)之间 。
    适用于区分不同元组类型(便于重用和区分),不需要(或者很容易)区分成员变量。
    成员变量匿名的struct类型定义。
struct Color {i32, i32, i32};
struct Point {i32, i32, i32};let bgColor = {0, 0, 0};
let pointA = {1, 2, 3};
  1. 增加属性,派生Debug trait
    在struct定义前增加:#[derive(Debug)]
    println中使用{:?},不能使用{ }
#[derive(Debug)]
struct Rect {width: i32,height: i32,
}fn main() {let rect = Rect { width: 20, height: 30 };println!("retc: {:?}\n", rect);
}
  1. 常用可派生trait
Debug
Copy
Clone
Default
Hash
PartialEq, Eq
PartialOrd, Ord
  1. 方法
    定义方式和函数类似,差别:
    1)定义在结构体(枚举、trait)上下文中:impl struct_name { }
    2)第一个参数是self,代表调用方法的实例。
    &selfself: &Self的缩写
    3)方法使用self,可获取所有权、不变借用、可变借用。
    4)impl块可以有多个,会自动合并
# 函数示例
struct Rect {width: i32,height: i32,
}fn area(rect: &Rect) -> i32 {rect.width * rect.height
}let r = Rect { width: 20, height: 30, };
let a = area(&r); # 调用函数
struct Rect {width: i32,height: i32,
}# 定义方法,
# 1. 在某个struct类型中:impl Rect { }
# 2. 第一个参数为:&self
# 3. 调用方式,通过实例调用:r.area()
impl Rect {fn area(&self) -> i32 {self.width * self.height}
}# 多个implimpl Rect {fn isSquare(&self) -> bool {self.width == self.height}
}let r = Rect { width: 20, height: 30, };
let x = r.area(); # 调用方法
let y = r.isSquare();
  1. 关联函数(像类的静态方法,和实例无关)
    定义在impl块中,没有self参数,通常用于定义new函数,创建关联结构体的实例。
    1)定义在imple中
    2)没有self参数
    3)返回Self类型(关联结构体类型)
    4)使用结构体类型名调用,不用实例调用:Rect::new()
struct Rect {w: i32,h: i32,
}impl Rect {fn new (a: i32, b: i32) -> Self {Self {w: a,h: b,}} // fn new
} // impllet r = Rect::new(20, 30);
  1. 枚举类型
enum IpAddrKind {V4,V6,
}

// 可以替代enum + struct
// 枚举成员可以是各种类型值,不同成员可以是不同类型。
// 枚举类型成员名字,也是一个构建枚举类型实例的函数。
enum IpAddrKind {V4 (u8, u8, u8, u8),V6 (String),
}let four = IpAddrKind::V4;struct Ipv4Addr { //...
}
struct Ipv6Addr { //...
}
// enum成员是struct类型
enum IpAddr {V4(Ipv4Addr),V6(Ipv6Addr),
}// 成员多种不同类型
enum Message {Quit,Move {x: i32, y:i32, },Write (String),ChangeColor(i32, i32, i32),
}// 在impl块中增加方法定义
impl Message {fn call(&self) {// ...}
}let m = Message::Write(String::from("hello"));
m.call();
  1. option
    Rust中没有空值(NULL)。
    Option是一个枚举类型。
    包含在preclude中,不需要显示引入作用域。
    使用Option就必须处理空值,其他不是Option类型的就一定不为空值。
enum Option<T> {None,Some(T),
}let num = Some(5);
let empty: Option<i32> = None;
  1. match运算符
enum Week {Mon,Tue,Sat,Sun,
}fn query(day: Week) -> i32 {match day {Week::Mon => 1,Week::Tue => {println!("...");2// }后面的,是可选的},Week::Sat => 6,Week::Sun => 7,}
}
  1. 绑定值模式
struct Ipv4Addr { //...
}
struct Ipv6Addr { //...
}
// enum成员是struct类型
enum IpAddr {V4(Ipv4Addr),V6(Ipv6Addr),
}// 在match匹配过程中,把值绑定到变量
fn process(data: IpAddr) {match data {IpAddr::V4 (addr4) => {// consume addr4},IpAddr::V6 (addr6) => {// consume addr6},}
}
  1. 匹配 Option 和 if let
    1)if let工作方式和match相同,是match的一个语法糖
    2)if let后面是:模式 = 表达式
    3)if let匹配match的一个分支,忽略其他值,也可以通过else分支处理。
fn func(x: Option<i32>) -> Option<i32> {match x {None => None,Some(i) => Some(i+1)}
}let num = Some(12);
let res2 = func(num);
let res3 = func(None);// 和上面match等价
if let Some(i) = num {Some(i+1)
} else {None
}
  1. 通配模式和 “”占位符
    Rust中match匹配必须是穷尽的。
    1)为所有情况单独处理每个分支,例如enum类型。
    2)使用通配模式,用到匹配的值。
    3)使用占位符“
    ”,和通配模式类似,匹配的值不用,抛弃。
    4)通配符或占位符只能在最后一个分支,否则其后面的分支不会被执行。
let result: i32 = func();
match result {6 => "lucky",8 => "money",other => println!("the result: {}", other),
}match result {6 => "lucky",8 => "money",_ => "ok",// 或者完全忽略_ => (),
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/118682.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

USB学习(2):USB端点和传输协议(数据包、事物)详解

接着上一篇文章USB学习(1)&#xff1a;USB基础之接口类型、协议标准、引脚分布、架构、时序和数据格式&#xff0c;继续介绍一下USB的相关知识。 文章目录 1 USB端点(Endpoints)1.1 基本知识1.2 四种端点 2 传输协议2.1 数据包类型2.1.1 令牌数据包(Token packets)2.1.2 数据数…

【机器学习合集】激活函数合集 ->(个人学习记录笔记)

文章目录 综述1. S激活函数(sigmoid&Tanh)2. ReLU激活函数3. ReLU激活函数的改进4. 近似ReLU激活函数5. Maxout激活函数6. 自动搜索的激活函数Swish 综述 这些都是神经网络中常用的激活函数&#xff0c;它们在非线性变换方面有不同的特点。以下是这些激活函数的主要区别&am…

学习笔记二十三:Deployment入门到企业实战应用

Deployment入门到企业实战应用 Deployment控制器&#xff1a;概念、原理解读Deployment概述Deployment工作原理&#xff1a;如何管理rs和Pod&#xff1f;什么叫做更新节奏和更新逻辑呢 Deployment使用案例&#xff1a;创建一个web站点,2个副本deploy-demo详细解读 通过k8s实现滚…

分布式:一文搞定Redis/Zookeeper/MySQL实现分布式锁

目录 一、项目准备spring项目数据库 二、传统锁演示超卖现象使用JVM锁解决超卖解决方案JVM失效场景 使用一个SQL解决超卖使用mysql悲观锁解决超卖使用mysql乐观锁解决超卖四种锁比较Redis乐观锁集成Redis超卖现象redis乐观锁解决超卖 三、分布式锁概述四、Redis分布式锁实现方案…

Ubuntu 命令行设置静态IP地址方法

一、先ifconfig查看电脑的网卡信息 找到有线网络或WiFi网络的网卡名称&#xff0c;我这里是eno1 二、输入route -n命令&#xff0c;打印路由表&#xff0c;这里主要是为了查看网关地址 我这里网关地址是192.168.10.1 三、更改配置文件 输入 vim /etc/network/interfaces&am…

Spring Boot拦截器Interceptor

文章目录 Interceptor 作用原理自定义 InterceptorStep 1 实现/继承Step 2 重写方法Step 3 拦截器Interceptor注册例子 Interceptor 作用 日志记录&#xff1a;记录请求信息的日志&#xff0c;以便进行信息监控、信息统计、计算 PV&#xff08;Page View&#xff09;等&#x…

禾匠旧版对接微信小程序发货系统(发货信息管理 接口)

最近小程序如果是商家交易需要再小程序后台点击一下发货&#xff0c;特别麻烦&#xff0c;但是旧版的禾匠又没有这个功能&#xff0c;所以只能手动增加这个功能&#xff0c;但是每一个版本发货逻辑都不一样&#xff0c;大家只能自己手动去兼容一下&#xff0c;下面只是写了一个…

实例详解:Java使用JWT和Redis实现高效单点登录(SSO)

前言 单点登录&#xff08;Single Sign-On&#xff0c;简称SSO&#xff09;是一种身份验证和访问控制机制&#xff0c;允许用户使用一组凭证&#xff08;如登录名和密码&#xff09;登录到多个应用程序中&#xff0c;而无需为每个应用程序单独进行身份验证。用户只需要登录一次…

uniapp 单选框以及多选框样式更改

radio以及checkbox默认样式不符合自身需求时&#xff0c;根据自身需求更改样式&#xff0c;以下是自身的示例&#xff1a; 单选&#xff1a; 多选&#xff1a; 由于uniapp自身包含了一套默认的样式&#xff0c;所以如果不想全局更改只想在某个单据页面使用的话&#xff0c;就…

Mysql,SqlServer,Oracle获取库名 表名 列名

先看下需求背景&#xff1a; 获取某个数据源连接下所有库名&#xff0c;库下所有表名&#xff0c;表中所有字段 1.MySql 先说MySql吧&#xff0c;最简单 1.1获得所有数据库库名 这是一个mysql和sqlserver公用的方法&#xff0c;这里url不用担心数据库问题&#xff0c;他其实…

程序的编译和链接

目录 翻译环境 linux下的测试 ​编辑 预定义符号 执行环境 #define定义宏 #和## # ## 宏参数的副作用 宏和函数对比 优点 缺点 #undef 条件编译 头文件包含 在标准c的任何实现中&#xff0c;存在两种环境——翻译环境和执行环境 翻译环境 翻译环境生成目标文件…

2023年中国磷酸一铵行业产能、产量及发展趋势分析:农业需求稳定增长[图]

磷酸一铵是一种重要的氮磷复合肥料&#xff0c;在农业生产中广泛应用。亚洲地区尤其是中国、印度等国家是磷酸一铵的主要消费市场。近年来&#xff0c;中国磷酸一铵产能呈现下降趋势&#xff0c;2022年开始恢复增长。2022年中国磷酸一铵产能达1945万吨&#xff0c;同比增长5.4%…

linux工具篇

文章目录 linux工具篇1. linux 软件包管理器-yum1.1 什么是软件包1.2 yum的使用1.3 yum源 2. linux编辑器-vim2.1 vim概念2.2 vim各个模式切换2.3 vim正常模式命令汇总2.4 vim底行模式各命令汇总2.5 vim的简单配置 3. Linux编译器-gcc/g使用3.1 复习程序编译过程(1) 预处理(2) …

二进制安装k8s

192.168.11.12 master01 192.168.11.12 y4 node01 192.168.11.14 y5 node02 192.168.11.15 对环境进行初始化&#xff0c;主机192.168.11.12、主机y4、主机y5&#xff0c;三台主机都要做以下操作&#xff0c;唯一不同的就是修改主…

目标检测YOLO实战应用案例100讲-船舶目标检测及编队识别(续)

目录 3.2.3 分类与回归 3.2.4 网络预设置与训练策略 3.3 实验与分析 3.3.1 实验环境 3.3.2

04.Finetune vs. Prompt

目录 语言模型回顾大模型的两种路线专才通才二者的比较 专才养成记通才养成记Instruction LearningIn-context Learning 自动Prompt 部分截图来自原课程视频《2023李宏毅最新生成式AI教程》&#xff0c;B站自行搜索 语言模型回顾 GPT&#xff1a;文字接龙 How are __. Bert&a…

如何为3D模型设置自发光材质?

1、自发光贴图的原理 自发光贴图是一种纹理贴图&#xff0c;用于模拟物体自发光的效果。其原理基于光的发射和反射过程。 在真实世界中&#xff0c;物体自发光通常是由于其本身具有能够产生光的属性&#xff0c;如荧光物质、发光材料或光源本身。为了在计算机图形中模拟这种效…

应急响应-网站入侵篡改指南_Webshell内存马查杀_漏洞排查_时间分析

1. 前言 一般安服在做项目的时候&#xff0c;经常会遇到需要做应急响应的工作&#xff0c;所谓应急响应就是当网站出现异常的时候&#xff0c;根据相关的问题对其进行溯源分析&#xff0c;发现问题&#xff0c;解决问题。 2. 网络安全异常特征 这里大概汇总一下网络安全异常的…

RustDay06------Exercise[91-100]

91.将指针还原成指定类型 因为指针不知道里面具体有什么,所以一般约定打上unsafe 申明开发者自己对该部分可用性负责,且在调试的时候也能起强调作用 // tests6.rs // // In this example we take a shallow dive into the Rust standard librarys // unsafe functions. Fix …

c语言从入门到实战——分支和循环

分支和循环 前言1. if语句1.1 if1.2 else1.3 分支中包含多条语句1.4 嵌套if1.5 悬空else问题 2. 关系操作符3. 条件操作符4. 逻辑操作符&#xff1a;&& , || , &#xff01;4.1 逻辑取反运算符4.2 与运算符4.3 或运算符4.4 练习&#xff1a;闰年的判断4.5 短路 5. swit…