Rust 快速入门(一)
Rust安装信息解释
-
cargo:Rust的编译管理器、包管理器、通用工具。可以用Cargo启动新的项目,构建和运行程序,并管理代码所依赖的所有外部库。
-
Rustc:Rust的编译器。通常Cargo会替我们调用此编译器。
-
Rustdoc:是Rust的文档工具。
基础语法
变量
Rust是强类型语言(Java、C++、Rust、Go ),但是具有自动判断变量类型的能力。
注意:
-
强类型语言要求每个变量在声明时必须指定明确的数据类型,并且在程序的整个生命周期中都必须遵循这个类型。语言通常会严格限制不同类型之间的隐式转换,只有明确的、兼容的转换才能进行。这种语言有助于减少由于类型不匹配而导致的错误,并且更容易进行静态检查和优化。
-
弱类型语言对变量的类型要求相对宽松。程序允许对不同类型的变量进行隐式转换,语言运行时会根据需要自动进行类型转换。这虽然提供了更多的灵活性,但也可能带来一些类型转换带来的潜在错误。
声明变量使用 let 关键字
let a = 123; let a:u64 = 12;// 带类型的声明
如果上述a被声明了,那么
a = "abc"; // a已经是一个int类型 a = 4.56; // a已经是一个int类型 a = 456; // Rust规范,在语言层面尽量少的让变量的值可以改变
上述三个是被禁止的操作,a被称为不可变变量(a的值不变,但是不代表它不是一个变量),这样操作是为了并发安全。
如果我们要声明一个可变变量,只需加一个 mut关键字
let mut a = 456
那么常量和不可变变量的区别是什么呢?
-
不可变量如下可编译
let a = 12; let a = 123;
可编译

只是有warning。
-
如果a为常量就不可编译了
const a: i32 = 123; let a = 456;

重影Shadowing
-
变量的值可以"重新绑定",但在"重新绑定"以前不能私自被改变,这样可以确保在每一次"绑定"之后的区域里编译器可以充分的推理程序逻辑。
-
这里的重影实际上就是上述“重新绑定”这个概念,重影即指的是变量名称可以被重新使用的机制。
-
重影与可变变量的赋值不是一个概念,重影是指用同一个名字重新代表另一个变量实体,其类型、可变属性和值都可以变化。但可变变量赋值仅能发生值的变化。
fn main() {let x = 5;let x = x + 1;let x = x * 2;println!("The value of x is: {}", x);
}
数据类型
注意:
-
Rust不支持 ++ 和 --
-
在Rust中,方法的调用优先级高于前缀运算符(对负值进行方法调用时一定要先加负号)
assert_eq!((-32760_i16).saturating_sub(10), -32768);
如果这里写成
-32760_i16.saturating_sub(10)则该断言一定panic
整数类型
| 位长度 | 有符号 | 无符号 |
|---|---|---|
| 8-bit | i8 | u8 |
| 16-bit | i16 | u16 |
| 32-bit | i32 | u32 |
| 64-bit | i64 | u64 |
| 128-bit | i128 | u128 |
| arch(机器字) | isize | usize |
isize 和 usize 两种整数类型是用来衡量数据大小的,它们的位长度取决于所运行的目标平台,如果是 32 位架构的处理器将使用 32 位位长度整型。
Rust在调用类型本身的方法之前,必须确切的知道一个值属于哪种整型,只有在解析完所有方法之后类型仍然不明确的时候,才会默认位i32。正确示例如下:
println!("{}", i32::abs(-4));println!("{}", (-4_i32).abs());
用于处理溢出的多种整型算术方法:
-
检查算法:检查运算会返回结果的 Option 值,如果数学意义上正确的结果可以表示为该类型的值,那么就为Some(v), 否则位None,如:
assert_eq!(10_u8.checked_add(20), Some(30)); // 可以运行,都处于u8的 0 - 2^8-1(255)范围内 assert_eq!(100_u8.checked_add(156), None); // 溢出了u8类型,所以会返回 None
-
回绕算法:会返回与“数学意义上正确的结果”对“值类型范围”取模的值相等的值,如:
assert_eq!(100_u16.wrapping_mul(200),20000); // 该行代码可以运行,20000 < u16的65535 assert_eq!(500_u16.wrapping_mul(500),53392); // 该行代码也可以运行,这是因为250000 > 2^16, 所以会用 250000 % 2^16 最终得到的便是 53392
需要注意的是对于有符号类型的运算可能会回绕为负值。
-
饱和算法:会返回最接近“数学意义上的正确结果”的可表达值(我理解为在计算值res溢出所选类型的最大值时,取所选类型最大值;计算值res所小于类型的最小值时,取所选类型最小值),如:
assert_eq!(32760_i16.saturating_add(10), 32767); assert_eq!((-32760_i16).saturating_sub(10), -32768);
注意:不存在饱和除法,饱和求余法或饱和位移法
-
溢出算法:返回一个元组(result, overflow), result是回绕版本所返回的内容,而overflowed是一个布尔值,指示是否发生过溢出,如:
assert_eq!(255_u8.overflowing_sub(2), (253, false)); // 未溢出 assert_eq!(255_u8.overflowing_add(2), (1, true)); // 溢出,返回回绕方法结果 1
浮点数类型
Rust提供了 IEEE 单精度浮点类型和 IEEE 双精度浮点类型。
let x = 2.0; // f64 let y: f32 = 3.0; // f32
浮点类型字面量:

浮点数中整数部分之后的每个部分都是可选的,但是必须存在浮点数部分,指数部分,类型后缀中的一项。
小数部分也可以由单独.组成,例如 5. 是一个浮点常量。
Rust会将整型字面量和浮点类型字面量视为不同的大类,即它永远不会把整型字面量推断为浮点类型。
一些特殊值关联常量
-
INFINITY:无穷大
-
NEG_INFINITY:负无穷大
-
NAN:非数值
-
MIN:最小有限值
-
MAX:最大有限值
使用示例
assert((-1./f32::INFINITY).is_sign_negative())
布尔类型
true,false
if和while这样的控制结构,他们的条件必须时bool表达式,Rust的as运算符可以将bool转化为整型:
assert_eq!(false as i32, 0) assert_eq!(true as i32, 1)
字符类型
char
Rust的 char 类型大小为 4 个字节(32位),代表 Unicode标量值(Java 2 字节, c/c++ 1字节)
Rust会对单独的字符使用char类型,但是对于字符串和文本流使用UTF-8编码。(所以String为UTF-8字符序列,而不是类似于Java中的字符数组)
转换
-
在Rust中字符被视为与数值截然不同的类型:char既不是u8,也不是u32(尽管他确实有32位长)
-
尽管数值类型和char是不同的,但是Rust位u8值提供了字节字面量,如:
b'X'表示以字符X的ASCII作为u8值 -
Rust不会再char和任何其他类型之间进行隐式转换。可以使用as转换运算符将char转换为整型,对于小于32位的类型,该字符值的高位会被截断。
-
u8是唯一能够通过as运算符转换为char的类型,因为Rust刻意让as运算符只执行开销极低且可靠的转换。
复合类型
-
元组:一对 ( ) 包括的一组数据,可以包含不同种类的数据
let tup: (i32, f64, u8) = (500, 6.4, 1); // tup.0 等于 500 // tup.1 等于 6.4 // tup.2 等于 1
Rust代码通常会使用元组类型从一个函数返回多个值(这里很像golang原生提供的多个返回值的特性),如:
let text = "我是米卫兵,我喜欢完原神,我也喜欢玩星穹铁道"; let(head, tail) = text.split_at(15); println!("{}", head); println!("{}", tail);零元组:又被称为 单元类型 ,用于:当无法携带任何有意义的值,但是其上下文仍然要求传入某种类型时。如:
fn swap<T>(x: &mut T, y: &mut T); // 上者完整写法如下: fn swap<T>(x: &mut T, y: &mut T) -> ();
还有一个点,需要注意:在使用单个值的元组的时候一定要追加尾逗号
("hello",),如此一来便可区分普通括号表达式和元组。 -
数组,和go类似,但是需要注意的几点如下
-
let d = [3; 5]; // 这样声明数组等效于 let d = [3, 3, 3, 3, 3];
-
然后就是
mut这个关键字,与不可变变量概念类似,只有一个数组声明了mut后,其中元素才可以被修改。
-
区别:
-
元组中每个元素都可以有不同的类型,而数组中所有元素必须是相同的类型。
-
元组只允许使用常量作为索引。如:
t.1,t.2而不能使用t.i
指针类型
不同于大多数具有垃圾回收机制的语言,Rust会将内存分配保持在最低限度。默认情况下会嵌套,三种指针类型:
引用
&String => 读作 “ref String” 是对String类型的引用。表达式 &x 会生成一个对x的引用,在Rust
术语中,我们会说它借用了对x的引用。给定一个引用r,表达式 *r会引用r指向的值。
-
与c/cpp类似:
-
当超出作用域时,引用不会自动释放任何资源。
-
-
与c/cpp不同:
-
Rust的引用永远不位空。
-
Rust会跟踪值的所有权和生命周期。
-
如此一来,Rust在编译期就可以排除悬空指针、双重释放和指针失效等错误。
Rust引用两种形式
-
&T
-
一个不可变共享引用。
-
-
mut T
-
一个可变的、独占引用。
-
Box
堆种分配内存最简单的方式:Box::new,如:
let t = (12, "eggs"); let b = Box::new(t) // t类型为(i32, &str) => b类型为Box<i32, &str>
当b超出作用域时,内存会立即被释放,除非b已经被移动(move)。
不安全指针(裸指针)
-
*mut T
-
*const T
相关文章:
Rust 快速入门(一)
Rust安装信息解释 cargo:Rust的编译管理器、包管理器、通用工具。可以用Cargo启动新的项目,构建和运行程序,并管理代码所依赖的所有外部库。 Rustc:Rust的编译器。通常Cargo会替我们调用此编译器。 Rustdoc:是Rust的…...
java 程序在服务器出现时区错误问题(使用Date,LocalDateTime,ZonedDateTime都不正确)
排查 查询系统时区信息 timedatectl status打印java的时区信息 import java.util.TimeZone;public class CheckTimeZone {public static void main(String[] args) {TimeZone defaultTimeZone TimeZone.getDefault();System.out.println("Default TimeZone ID: "…...
Kotlin 语言的协程是什么?
目录 1. 什么是协程 2. 协程的基本概念 3. 如何使用协程 3.1. 引入依赖 3.2. 启动协程 3.3. 使用挂起函数 4. 结构化并发 5. 处理异常 6. 总结 Kotlin 的协程是一种轻量级的线程,可以用于简化异步编程。它允许你以顺序的方式编写异步代码,从而提…...
uniapp 游戏 - 使用 uniapp 实现的扫雷游戏
0. 思路 1. 效果图 2. 游戏规则 扫雷的规则很简单。盘面上有许多方格,方格中随机分布着一些雷。你的目标是避开雷,打开其他所有格子。一个非雷格中的数字表示其相邻 8 格子中的雷数,你可以利用这个信息推导出安全格和雷的位置。你可以用右键在你认为是雷的地方插旗(称为标…...
LeetCode组合总和
题目描述 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制重复被…...
MATLAB - 机械臂手眼标定(眼在手内) - 估计安装在机器人上的移动相机的姿态
系列文章目录 前言 本示例展示了如何为装有手眼构型摄像头的机械臂或机械手执行和验证手眼校准。 一、概述 执行手眼校准有助于操作配备末端执行器(简称 “手”)的机械臂,该末端执行器依赖于摄像头提供的视觉数据。一旦完成了眼在手外的校准&…...
【Unity】TextMeshPro 3.0.9无法显示emoji表情问题
需要下载TextMeshPro 3.2.x-pre.xxx版本,重新生成Sprite Asset文件解决 注意:若Package Manager没有搜到pre版本,那么可以去github下载到本地,再解压后,将文件夹移动到工程Packages文件夹下,然后打开Packa…...
金九银十软件测试面试题(800道)
今年你的目标是拿下大厂offer?还是多少万年薪?其实这些都离不开日积月累的过程。 为此我特意整理出一份(超详细笔记/面试题)它几乎涵盖了所有的测试开发技术栈,非常珍贵,人手一份 肝完进大厂 妥妥的&#…...
中国剩余定理 C++
题目 解题思路 原链接:https://www.acwing.com/solution/content/3539/ 大致步骤: 将第2,3,4…n个方程不断与第一个方程合并,得到方程a1k1a2k2m2-m1;用扩展欧几里得算法解出a1k1a2k2gcd(a1, a2)的结果,再将结果扩大(m2-m1)/d倍即…...
动态规划lc
先找到规律,然后找边界情况;部分特殊情况分类讨论 *递归 70.爬楼梯 简单 提示 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:…...
介绍xshell的使用技巧
使用技巧目录 1. 开启左键选中即复制,右键点击即粘贴2. 开启撰写功能3. 开启日志记录功能 1. 开启左键选中即复制,右键点击即粘贴 参考:https://blog.csdn.net/chirrupy_hamal/article/details/108619262 2. 开启撰写功能 使用场景&#x…...
揭秘语音识别巨头1:国内外顶尖技术服务商全解析01(万字长文)
一、学习导航 解密语音识别巨头:国内顶尖技术服务商全解析00:学习地图 解密语音识别巨头:国内顶尖技术服务商全解析01:微软语音,商业No.1 解密语音识别巨头:国内顶尖技术服务商全解析02:百度…...
JAVA使用SM2算法生成密钥对加密解密加签验签
简介 SM2是非对称加密算法,一提非对称加密算法,第一想到的是RSA,没错,这个就是替代RSA的。它是基于椭圆曲线密码的公钥密码算法标准,其秘钥长度256bit,包含数字签名、密钥交换和公钥加密,用于替…...
uniapp(vue)打包web项目页面刷新后报404解决方案
一、问题概述 uniapp是一款优秀的跨平台开发框架,它可以帮助开发者快速构建出适用于多端的应用程序。然而,在项目打包后,有可能发现页面在刷新时会出现404错误。这无疑给用户体验带来了极大的困扰,下面我们就来分析一下这个问题。…...
ansible学习之ansible-vault
相关文档参考:http://www.ansible.com.cn/docs/playbooks_vault.html#what-can-be-encrypted-with-vault ansible-vault 功能介绍 Ansible-Vault是一个用于加密和管理Ansible playbook中敏感数据的工具。通过创建、编辑、加密、解密、查看和重置密码,可以安全地存储…...
封装el-upload组件,用于上传图片和视频的组件
使用环境 vue3element plus 需要根据后端返回结构修改的函数:onPreview onRemove onSuccess 组件使用 基本使用 源代码: <script setup> import AutoUploadFile from /components/auto-upload-file/index.vue function change(urls){console.log…...
6.将扩散模型与其他生成模型的关联(2)
1.归一化流与扩散模型 自一化流(Normalizing Flow)是生成模型,通过将易于处理的分布进行变换以队对高维数据进行建模。归一化流可以将简单的概率分布转化为极其复杂的分布,并用于强化学习、变分推理等领域。 现有的归一化流是基于变量替换公式构…...
【C++】基于红黑树封装set和map
🚀个人主页:小羊 🚀所属专栏:C 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 前言一、更高维度的泛型二、模版参数三、比较逻辑的重写四、迭代器4.1 const迭代器4.2 重载4.3 - -重载 五、完整代…...
24最新新手入门指南:Stable Diffusion!
前言 Stable Diffusion,一款新兴的开源AI绘画软件,正逐渐成为数字艺术家和爱好者的新宠。它的强大功能让用户能够轻松创造出令人印象深刻的数字艺术作品。 无论你是专业艺术家还是艺术新手,Stable Diffusion都为你提供了一个探索创造力的新…...
Java-基础
1. 导入模块不能纯粹的复制粘贴,要从new里导入,因为前者建立不了关联 2. 数组 String[] name{"张三","李四","王五"};int[] numsnew int[]{1,2,3};//二维String[][] names{{"张三","李四"},{"…...
Transformer 从0到1:注意力机制的数学形式——Query, Key, Value 三元组
# Transformer 从0到1:注意力机制的数学形式——Query, Key, Value 三元组## 1. 引言:从序列建模的困境到注意力机制的诞生在深度学习的发展历程中,处理序列数据(如文本、音频、时间序列)一直是核心挑战之一。早期的循…...
如何三步搞定iOS微信聊天记录完整导出:隐私保护与数据备份终极指南
如何三步搞定iOS微信聊天记录完整导出:隐私保护与数据备份终极指南 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 还在为无法永久保存重要微信对话而烦恼吗&…...
InoDriverShop参数设置避坑指南:如何避免伺服系统调试中的常见错误
InoDriverShop参数设置避坑指南:如何避免伺服系统调试中的常见错误 伺服系统调试是工业自动化领域中的关键环节,而InoDriverShop作为一款功能强大的伺服驱动配置工具,其参数设置的准确性直接影响到设备的运行性能。本文将深入剖析新手工程师…...
Mermaid Live Editor终极指南:10个团队协作和项目管理的实用技巧
Mermaid Live Editor终极指南:10个团队协作和项目管理的实用技巧 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-l…...
如何为Whisper ASR Webservice开发自定义引擎和插件
如何为Whisper ASR Webservice开发自定义引擎和插件 【免费下载链接】whisper-asr-webservice OpenAI Whisper ASR Webservice API 项目地址: https://gitcode.com/gh_mirrors/wh/whisper-asr-webservice Whisper ASR Webservice是一个基于OpenAI Whisper的语音识别服务…...
[拆解LangChain执行引擎-07] 静态上下文在Pregel中的应用
在 Pregel 模型中,静态上下文是一个专门设计的依赖注入容器。它的出现是为了解决在复杂的图计算中,如何优雅地处理“不属于图状态,但Node运行又必须依赖的外部环境信息”这一痛点。这些数据具有一个共同的性质,那就是在整个运行生…...
为什么需要虚拟摄像头?OBS-VirtualCam 3大核心价值解析
为什么需要虚拟摄像头?OBS-VirtualCam 3大核心价值解析 【免费下载链接】obs-virtual-cam obs-studio plugin to simulate a directshow webcam 项目地址: https://gitcode.com/gh_mirrors/ob/obs-virtual-cam 在视频会议和在线教学中,你是否曾希…...
LangChain + AgentRun 浏览器沙箱极简集成指南
AgentRun Browser Sandbox 介绍 什么是 Browser Sandbox? Browser Sandbox 是 AgentRun 平台提供的云原生无头浏览器沙箱服务,基于阿里云函数计算(FC)构建。它为智能体提供了一个安全隔离的浏览器执行环境,支持通过标准的 Chrome DevTools Protocol (…...
MDS vs PCA:哪种降维方法更适合你的数据?
MDS与PCA深度对比:从算法原理到实战选型指南 当面对高维数据时,降维技术就像一把打开数据奥秘的钥匙。在众多降维方法中,多维尺度变换(MDS)和主成分分析(PCA)是最常被比较的两种经典技术。它们都能将复杂的高维数据简化为更易理解的二维或三维…...
文华财经与博易大师双轨期货多空变色线指标实战解析
1. 双轨期货多空变色线指标是什么? 如果你经常使用文华财经或博易大师进行期货交易,一定对主图上的各种技术指标不陌生。今天要介绍的这个双轨期货多空变色线指标,可以说是趋势交易者的"秘密武器"。简单来说,它就像给K线…...
