Rust 语法笔记
变量绑定(声明变量)
let 变量名: 类型 = 变量值;
let 变量名 = 变量值[类型];
// 整型 默认 i32;浮点 默认 f64
所有的 let 绑定都必须尾接;,代码块也不例外。
mut
可以通过重新声明的方式来改变变量类型
可以下划线改善数字的可读性
声明常量
const / static
除了string字面量,其他类型的 static 必须显示声明类型 &'static str
原生类型 primitives
标量类型 scalar type
* 有符号整数(signed integers)
i8、i16、i32、i64、i128 和 isize(指针宽度)
* 无符号整数(unsigned integers)
u8、u16、u32、u64、u128 和 usize(指针宽度)
* 浮点数(floating point)
f32、f64
* 字符(char)
char 单个 Unicode 字符,如 ‘a’,‘α’ 和 ‘∞’(每个都是 4 字节)
* 布尔型(bool)
bool 只能是 true 或 false
* 单元类型(unit type)
()。其唯一可能的值就是 () 这个空元组
尽管单元类型的值是个元组,它却并不被认为是复合类型,因为并不包含多个值。
复合类型 compound type
数组(array)
如 [1, 2, 3]
类型标记 [类型; 长度]
切片 slice
长度不定
类型标记 &[T]
slice 可以用来借用数组的一部分
slice[0]
slice.len()
数组可以自动被借用成为 slice
&数组名
元组(tuple)
如 (1, true)
元组可以解构赋值
let foo = Foo { x: (1, 2), y: 3 };
let Foo { x: (a, b), y } = foo;
可以通过下标访问 元组名.0
单个元素的元组需要补一个逗号, 与带括号的字面量区分开
元组可以嵌套
函数可以使用元组来返回多个值
自定义类型
结构体 struct
- 元组结构体 相当于 具名元组
- C 语言风格结构体
struct 结构名 {属性名1: 类型,属性名2: 类型,
}
- 单元结构体(unit struct)
不带字段,在泛型中很有用
.. 解构结构体只会添加还没有设置的元素
let point: Point = Point { x: 10.3, y: 0.4 };
let bottom_right = Point { x: 5.2, ..point };
// (5.2, 0.4)let Point { x: left_edge, y: top_edge } = point;
// left_edge top_edge 分别取到 x,y 的值
let Pair(integer, decimal) = Pair(1, 0.1);
枚举 enum
enum WebEvent {// 一个 `enum` 可以是单元结构体(称为 `unit-like` 或 `unit`),PageLoad,PageUnload,// 或者一个元组结构体,KeyPress(char),Paste(String),// 或者一个普通的结构体。Click { x: i64, y: i64 }
}
访问枚举值
// 方法一:
WebEvent::PageLoad// 方法二:
use WebEvent::{PageLoad};
// or
// use WebEvent::*;
let xxx = PageLoad; // 等价于 WebEvent::PageLoad
分支判断枚举
match event {WebEvent::PageLoad => println!("page loaded"),WebEvent::PageUnload => println!("page unloaded"),// 从 `enum` 里解构出 `c`。WebEvent::KeyPress(c) => println!("pressed '{}'.", c),WebEvent::Paste(s) => println!("pasted \"{}\".", s),// 把 `Click` 解构给 `x` and `y`。WebEvent::Click { x, y } => {println!("clicked at x={}, y={}.", x, y);},
}
枚举默认值从0开始
显示赋值
enum Color {Red = 0xff0000,Green = 0x00ff00,Blue = 0x0000ff,
}
使用时可进行类型转化来访问值
Color::Red as i32
enum 的一个常见用法就是创建链表
类型系统
类型转换
Rust 不提供原生类型之间的隐式类型转换
通过 as 显示的类型转化
someVar as u32
当把任何类型转换为无符号类型 T 时(数据范围不匹配),会不断加上或减去
(std::T::MAX + 1)直到值位于新类型 T 的范围内。
实际实现是:从最低有效位(LSB,least significant bits)开始保留 8 位,然后剩余位置,直到最高有效位(MSB,most significant bit)都被抛弃。
当把无符号类型转化为等长的有符号类型,最高位为1时标记为负数详情查阅 计算机原理-补码相关内容
#![allow(overflowing_literals)]不显示类型转换产生的溢出警告。
rust 1.45 以后,将浮点数转化为无符号整数,超出上限 会直接转化为最大值;低于下限 会直接取 0。
因为若按上述方法转化会让结果难以预料。
但依然可以使用.to_int_unchecked::<u8>()维持原来的转化方式
字面量
可通过后缀方式声明其类型
整数 默认 u32
浮点数 默认 f64
类型推断
可以根据赋予的值,来推断类型
减少显示声明类型
Vec 可以通过传入数据的类型 确定其类型
别名 type
可以使用 type 对类型进行别名。
但必须采用大驼峰的命名方式
type Inch = u64;
可以使用
#[allow(non_camel_case_types)]屏蔽此规则
类型转化方法
最一般的转换会用到 From 和 Into 两个 trait。
From 与 Into
impl From<i32> for Number {fn from(item: i32) -> Self {Number { value: item }}
}
let num = Number::from(30);
Into trait 就是把 From trait 倒过来而已
已经写 From 后,便不再需要写 Into 了
同into的类型也不需要注明
let int = 5;
let num: Number = int.into();
TryFrom 与 TryInto
use std::convert::TryFrom;
use std::convert::TryInto;
TryFrom 和 TryInto trait 用于易出错的转换,也正因如此,其返回值是 Result 型。
impl TryFrom<i32> for EvenNumber {type Error = ();fn try_from(value: i32) -> Result<Self, Self::Error> {if value % 2 == 0 {Ok(EvenNumber(value))} else {Err(())}}
}
Ok()
Err()
let result: Result<EvenNumber, ()> = EvenNumber::try_from(8)
let result: Result<EvenNumber, ()> = 8i32.try_into();
ToString 与 FromStr
实现 fmt::Display trait,它会自动提供 ToString
调用 ToString
circle.to_string()
use std::string::ToString;
impl ToString for Circle {fn to_string(&self) -> String {format!("Circle of radius {:?}", self.radius)}
}
只要对目标类型实现了 FromStr trait,就可以用 parse 把字符串转换成目标类型。
// 两种提供类型的方式
let parsed: i32 = "5".parse().unwrap();
let turbo_parsed = "10".parse::<i32>().unwrap();
表达式
代码块也是表达式,所以它们可以用作赋值中的值。
代码块中实际执行的 最后一个表达式 将作为代码块的返回
注意:不要加分号。加了分号就是普通语句,最会代码块中就没有执行的表达式,因而会返回()
流程控制
if/else
条件不需要用括号包裹
if n < 0 {print!("{} is negative", n);
} else if n > 0 {print!("{} is positive", n);
} else {print!("{} is zero", n);
}
if else 本质上也是代码块,因此也可以用于赋值
loop
loop 无限循环
loop {···if 条件 {// 跳过这次迭代的剩下内容continue;}if 条件 {// 退出循环break;}
}
循环设置标签
continue、break 可以通过标签 直接影响外层循环
'outer: loop {'inner: loop {break 'outer;}
}
可以通过break 表达式; 为 loop 设置返回值。
用途:尝试一个操作直到成功为止
while
while 条件 {
}
for
使用区间标记
a..b可以创建一个迭代器
a..=b包含b
for n in 1..101 {
}
for 循环默认会使用 into_iter 函数
for name in names.iter()
for name in names.into_iter()
for name in names.iter_mut()
迭代器的方法
into_iter、iter、iter_mut
iter - 在每次迭代中借用集合中的一个元素。这样集合本身不会被改变,循环之后仍可以使用。
into_iter - 会消耗集合。在每次迭代中,集合中的数据本身会被提供。一旦集合被消耗了,之后就无法再使用了,因为它已经在循环中被 “移除”(move)了。
iter_mut - 可变地(mutably)借用集合中的每个元素,从而允许集合被就地修改。
match
match 会检查匹配覆盖
match number {// 匹配单个值1 => println!("One!"),// 匹配多个值2 | 3 | 5 | 7 | 11 => println!("This is a prime"),// 试一试 ^ 将 13 添加到质数列表中// 匹配一个闭区间范围13..=19 => println!("A teen"),// 处理其他情况_ => println!("Ain't special"),
}
match 解构方式
解构元组
match triple {// 解构出第二个和第三个元素(0, y, z) => println!("First is `0`, `y` is {:?}, and `z` is {:?}", y, z),// `..` 可用来忽略元组的其余部分(1, ..) => println!("First is `1` and the rest doesn't matter"),_ => println!("It doesn't matter what they are"),
}
解构枚举
枚举中的元组也可通过上法解构
解构指针
现在还不懂指针,先跳过???
match 卫语句(guard)
可以加上 match 卫语句(guard) 来过滤分支。
给匹配增加额外的if条件判断
match pair {// “if x == y” 是一个卫语句(x, y) if x == y => println!("These are twins"),(x, y) if x + y == 0 => println!("Antimatter, kaboom!"),(x, _) if x % 2 == 1 => println!("The first one is odd"),_ => println!("No correlation..."),
}
match 重新绑定
在 match 中,若间接地访问一个变量,则不经过重新绑定就无法在分支中再使用它。
@ 符号 用来绑定变量到名称
match age {n @ 1 ..= 12 => println!("I'm a child of age {:?}", n),
}
if let
判断let是否绑定成功
// 若 `let` 将 `number` 解构成 `Some(i)`,则执行
if let Some(i) = number {println!("Matched {:?}!", i);
}// 匹配枚举
if let Foo::Bar = b {println!("b is foobar");
}
直接使用
if Foo::Bar==a,需要注明#[derive(PartialEq)]
while let
与上类似
可以简化 循环与match的组合代码
函数
默认与代码块的返回逻辑相同
但可以 return 提前返回
fn 函数名(参数: 类型, ···) -> 返回类型 () {···[return xxx]
}
方法
依附于对象的函数
方法在 impl 代码块中定义。
通过关键字 self 来访问对象中的数据和其他。
self为self: Self的语法糖(sugar)其中Self是方法调用者的类型。
&self是self: &Self的语法糖
&mut self为self: &mut Self
self: 会消耗本身
&self: 引用 self
&mut self: 可变引用 self
加入到方法的参数中
impl Point {fn origin() -> Point {Point { x: 0.0, y: 0.0 }}fn new(x: f64, y: f64) -> Point {Point { x: x, y: y }}
}
闭包
- 声明时使用
||替代()将输入参数括起来。 - 函数体定界符(
{})对于单个表达式是可选的。 - 有能力捕获外部环境的变量。
|i: i32| -> i32 { i + 1 };
|i | i + 1 ;
相关文章:
Rust 语法笔记
变量绑定(声明变量) let 变量名: 类型 变量值; let 变量名 变量值[类型]; // 整型 默认 i32;浮点 默认 f64所有的 let 绑定都必须尾接;,代码块也不例外。 mut 可以通过重新声明的方式来改变变量类型 可以下划线改善数字的可读…...
AI智慧安防智能监控平台如何做到健身房智能视频监控?
随着大家对健身的重视,健身房也开始遍地开花,健身房的兴起是必然的,但是健身房的管理不容疏忽,通过EasyCVR智能视频监控系统,则可以解决监管不足的问题。 1、安全摄像头布局 根据健身房的大小和布局,合理规…...
ps插件Coolorus for Mac中文激活版
Coolorus是一款非常实用的Photoshop插件,它为Photoshop增加了色环配色面板,让设计师可以更直观地选择颜色。同时,Coolorus还提供了多种专业配色方案,如鲜艳色、复古色、日常色等,设计师可以直接套用这些方案࿰…...
MySQL的索引——索引的介绍及其数据结构B+树 索引的类型 索引的使用及其失效场景 相关名词解释
前言 索引是存储引擎用于快速查找数据纪录的一种数据结构,索引是数据库中经常提及的一个词,究竟什么是索引,索引的数据结构是什么,索引有什么类型? 本篇博客尝试阐述数据库索引的相关内容,涉及什么是索引…...
第十六届中国智慧城市大会 | 国产化三维重建技术服务智慧城市建设
2023年10月13日,由武汉大势智慧科技有限公司、飞燕航空遥感技术有限公司主办的第十六届智慧城市大会-实景三维技术创新与应用论坛在广州成功举办。 来自实景三维、自然资源、数字孪生、AI大数据、航空遥感等多个领域的专家,深度分享各自的智慧城市建设经…...
通过数组的指针获得数组个数
这几天学习智能指针时,自己在练习写个管理数组指针的类时碰到了通过数组指针获取数组个数的问题 1.在网上查询了通过数组指针获取数组个数的方法,对于自定义数据在前四个节点保存了数组个数 Student* pAry new Student[3];size_t num *((size_t*)pAry - 1);//3测试是成功的…...
GeoServer改造Springboot启动四(解决post接口方法无法用@requestbody为入参的请求)
1、修改源码4 解决问题:解决Controller接口post方法(如图 19)无法用@requestbody为入参的 json数据进行请求,用swagger请求示例如图 20,具体错误呈现如图 21。 图 19Controller接口示例 图 20post接口请求示例 图 21post接...
C#,数值计算——分类与推理Phylagglomnode的计算方法与源程序
1 文本格式 using System; using System.Collections.Generic; namespace Legalsoft.Truffer { public class Phylagglomnode { public int mo { get; set; } public int ldau { get; set; } public int rdau { get; set; } public …...
mysql、oracle 构建数据
mysql 构建数据 --创建表 set sql_modeONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ALLOW_INVALID_DATES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION CREATE TABLE vote_records_memory ( id int(10) unsigned NOT NULL AUTO_INCRE…...
二叉树;二叉树的前序、中序、后序遍历及查找;顺序存储二叉树;线索化二叉树
数组、链表和树存储方式分析 对于树结构,不论是查找修改还是增加删除,效率都比较高,结合了链表和数组的优点,如以下的二叉树: 1、数组的第一个元素作为第一个节点 2、数组的第二个元素3比7小,放在7的左边…...
有手就会做!保姆级Jmeter分布式压测操作流程(图文并茂)
分布式压测原理 分布式压测操作 保证本机和执行机的JDK和Jmeter版本一致配置Jmeter环境变量配置Jmeter配置文件 上传每个执行机服务jmeter chmod -R 755 apache-jmeter-5.1.1/ 执行机配置写自己的ip 控制机配置所有执行机ip,把server.rmi.ssl.disable改成true 将本机也作为压…...
澳洲谷揽GRANAR谷物分析仪维修GR-1800蛋白检测仪
澳洲GRANAR谷揽GR-1800谷物分析仪应用领域:大豆、油菜籽、亚麻籽 常用分析指标:蛋白质、芥酸、水分、灰分 、油脂等 分析时间:<3min 使用场景:谷物收购、生产加工、实验室 GR-1800i型号特点 1.检测时间由3分钟缩短…...
python基础语法(1)
基础语法 前言一、常量和表达式二、变量和类型变量是什么变量的语法(1)定义变量(2) 使用变量 变量的类型(1) 整数(2) 浮点数(小数)(3)字符串(string)可以使用单引号或双引号创建字符串(4) 布尔(5) 其他(1)类型决定了数据在内存中占…...
Web前端开发——新年倒计实时刷新
Web前端开发——年倒计实时刷新 H5(HTML5)前端开发是指使用HTML5、CSS3和JavaScript等技术进行网页和移动应用的开发。HTML5是最新的HTML标准,提供了丰富的语义化标签和功能,使得网页可以更加优雅和多样化。CSS3是用于样式表的升级版本,提供了更多的样式效果和布局控制能…...
ubuntu20.4 执行sudo apt-get update出现错误 libnettle.so.6 动态链接库错误
一、错误描述 sudo apt-get update 报错提示 libnettle.so.6 动态链接库错误 $ sudo apt update /usr/lib/apt/methods/https: error while loading shared libraries: libnettle.so.6: cannot open shared object file: No such file or directory /usr/lib/apt/methods/ht…...
机器人控制算法——TEB算法—Obstacle Avoidance and Robot Footprint Model(避障与机器人足迹模型)
1.How Obstacle Avoidance works 1.1处罚条款 避障是作为整体轨迹优化的一部分来实现的。显然,优化涉及到找到指定成本函数(目标函数)的最小成本解(轨迹)。简单地说:如果一个计划的(未来&…...
谷歌浏览器报错:VM108:5 crbug/1173575, non-JS module files deprecated.
报错 解决 控制台调整为fast 3G...
Google Colab免费GPU使用教程
目录 前言一、Google Colab介绍二、使用步骤1、创建谷歌云盘2、创建一个新的Colab Notebook3、设置免费的GPU4、挂载Google Drive5、运行代码 三、防止掉线措施四、参考 前言 有时候本地跑代码可能耗时比较久,而且还会耽误你本地电脑的使用,购买云服务器…...
C++标准模板(STL)- 类型支持 (数值极限,C 数值极限接口)
C 数值极限接口 参阅 std::numeric_limits 接口 定义于头文件 <cstdint> PTRDIFF_MIN (C11) std::ptrdiff_t 类型对象的最小值 (宏常量) PTRDIFF_MAX (C11) std::ptrdiff_t 类型对象的最大值 (宏常量) SIZE_MAX (C11) std::size_t 类型对象的最大值 (宏常量) SIG_ATOMI…...
Eclipse Xtext 实现PLC ST 语言到C的转换
Eclipse Xtext 是开发领域专用语言(DSL)的工具。例如数据库的SQL 语言,PLC 的ST 语言都是一种领域专用语言。在开放自动化领域,提倡基于模型的设计方法。DSL 是描述模型的强有力工具。 在开发PLC 程序IDE时,开发ST编译…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
