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编译…...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

五子棋测试用例
一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...
用js实现常见排序算法
以下是几种常见排序算法的 JS实现,包括选择排序、冒泡排序、插入排序、快速排序和归并排序,以及每种算法的特点和复杂度分析 1. 选择排序(Selection Sort) 核心思想:每次从未排序部分选择最小元素,与未排…...

第2课 SiC MOSFET与 Si IGBT 静态特性对比
2.1 输出特性对比 2.2 转移特性对比 2.1 输出特性对比 器件的输出特性描述了当温度和栅源电压(栅射电压)为某一具体数值时,漏极电流(集电极电流...