【Rust】速度入门---打印个螃蟹先
参考: 菜鸟教程
1 输出到命令行
这不得打印个螃蟹
// 代码来自官方入门教程
// ferris_say需要另外安装
use ferris_says::say;
use std::io::{stdout, BufWriter};fn main() {let stdout: std::io::Stdout = stdout();let msg: String = String::from("Hello fellow Rustaceans!");let width: usize = msg.chars().count();let mut writer: BufWriter<std::io::StdoutLock> = BufWriter::new(stdout.lock());say(msg.as_bytes(), width, &mut writer).unwrap();}
cargo run 查看螃蟹。它叫Ferris,乃Rust社区的吉祥物。

老规矩打印“Hello world!”
这就需要用到print!( )和println!( )两个宏规则
println!( )输出后会换行但print!( )不会
提到输出就不得不提格式化字符串了,Rust的占位符{}
fn main() {let msg: &str = "Hello world!";println!("Hello world!");// {}内填数字,把格式字符串之后的可变参数当数组来用(下标也是从零开始)print!("{0}, {0}", msg); // 格式化字符串print!(" Very good!");
}

2 变量
2.1 不可变的变量
Rust是强类型语言,但具有自动判断变量类型的能力
声明变量,需要
let(写JavaScript的时候用过诶)
单单使用个let声明的变量,被官方称为"不可变变量"
- 在确定变量类型后,不能把其他类型的值赋给它
- Rust不允许精度有损失的自动数据类型转换
- 记住了!!!这是它是“不可变变量”
//虽然Rust会自动判断变量类型但是手动加上比较好
//整型默认是 32位,手动写成 64位,变量取值范围大大的不一样
let hell: i32 = 234;
let hell: i64 = 1234;let msg: &str = "Hello hell!";
只需要加一个
mut就能是”不可变变量“可变啦
fn main() {let mut msg: &str = "Hello world!"; //①// print!("{}", msg);msg = "Hello hell!";print!("{0}, {0}", msg); //②print!(" Very good!");
}
上面的代码运行后会出现警告
warning: value assigned to msg is never read
说是①位置的 msg 的值永远无法读取到。因为在打印之前修改了它的值,这样变量最开始的值就访问不到了,把注释取消,警告就会消失
2.2 常量和不可变变量的区别
下面代码在Rust中是合法,但是①位置的
hell未被使用,所以会有警告
warning: unused variable:hell
这里操作叫重影
fn main() {let hell: i32 = 123; // ①let hell: i32 = 234; // ②print!("{}", hell);
}
但是如果是常量,那就不行了,得报错了
error[E0005]: refutable pattern in local binding
//这么写是错误的
fn main() {const hell: i32 = 123;let hell: i32 = 234;print!("{}", hell);
}
2.3 重影
变量名可以重新使用的机制
和其他语言的“重写”或“重载”是不一样的
重影是指用同一个名字重新代表另一个变量实体,其类型、可变属性和值都可以改变。
可变变量赋值就不一样了,赋值只能改变值
这样整是会报错的
error[E0308]: mismatched types
fn main() {let mut welcome: &str = "Hello hell";let len: i32 = welcome.len().try_into().unwrap();println!("The length of welcome is {}", len);welcome = welcome.len();println!("The length of welcome is {}", welcome);
}
这个是会
Rust不会帮你自动转换类型,需要解锁
可以使用as或者try_into
fn main() {let welcome: &str = "Hello hell";//len()返回的是usize//let len: i32 = welcome.len() as i32;let len: i32 = welcome.len().try_into().unwrap();println!("The length of welcome is {}", len);
}
// The length of welcome is 10
2.4 数据类型
整数型 整数还能加下划线
//这是合法的
let a: i32 = 199_0000;
let a: i32 = 199_0_0_0;
//写成这样也没毛病,不过加下划线是为更容易判断数据大概多大的

浮点型32位浮点数(
f32)和64位浮点数(f64)
我的电脑是默认64位的
布尔型
true和false
字符串
char
一些简单的数学运算
rust不支持自增自减(++, --)
fn main() {let mut sum: i32 = 5 + 10;println!("{}", sum);sum += 1;let dif: f64 = 9.5 - 1.2;let mul: i32 = 7 * 10;let rem: i32 = 43 % 3;println!("{}, {}, {}, {}", sum, dif, mul, rem);
}
//15
//16, 8.3, 70, 1
复合类型 元组
()数组[]
let msg = ['H'; 5];
//等价于let msg = ['H', 'H', 'H', 'H', 'H'];
let ele = msg[0];
println!("{}", ele);
let array: [[i32; 3]; 2] = [[1,2,3], [3,4,2]];
println!("{}", array[0][0]);
3 函数
fn<函数名> (<参数>) <函数体>
函数体表达式不能使用return
fn main() {let y = { // 表达式块 函数体表达式let x = 4;x + 2 // 表达式, 它的结果是整个表达式所代表的值};//嵌套的函数//跟Python的挺像的, 不过Python就一个样子在哪fn print_var(var: i32) -> i32 {// print!("OK... ");// var + 2return var + 2;}print(print_var(y));print(y);println!("Value of y is {}", y);
}fn print(x: i32) {// println!("Hello, world!");println!("{}", x);
}
4 条件
条件不需要向C语言一样加
()
fn main() {let msg: &str = "hello";let _msg_other: &str;if msg == "hello" {_msg_other = "hell";}else if msg == "Hello"{_msg_other = "Boom"; // 如果注释这句,将会报错// _msg_other可能会未初始化println!("HHHH");}else {_msg_other = "world";}println!("{}, {}", msg, _msg_other);
}
条件表达式必须是
bool类型
fn main() {let number = 3;if number {// 报错,expected `bool`, found integerrustc(E0308) println!("Yes");}
}
可以实现类似三元条件运算表达式(A?B:C)的效果
{}中的表达式必须是同一类型不然会报错
error:ifandelsehave incompatible types
少了else{} 也会报错的
error:ifmay be missing anelseclause
ifexpressions withoutelseevaluate to()
fn main() {let r = 3;let msg = if r > 0 { "Hello hell!" } else { "haha" };println!("{}", msg);
}
5 循环
5.1 while
fn main() {let mut index: i32 = 0;// let mut index: usize = 0;let msg: [&str; 4] = ["Hell", "Hello", "World", "Judy"];while index != 4 {// 下标的类型必须是 usizeprintln!("{}", msg[index as usize]);index += 1;}println!("EXIT");
}
运行结果:
Hell
Hello
World
Judy
EXIT
5.2 for
for 循环是最常用的循环结构,常用来遍历一个线性数据结构
fn main() {let msg: [&str; 4] = ["Hell", "Hello", "World", "Judy"];// msg.iter 表示是 msg的迭代器for i in msg.iter() {println!("{}", i);}
}
fn main() {let msg: [&str; 4] = ["Hell", "Hello", "World", "Judy"];for i in 0..4 {println!("msg[{}] = {}", i, msg[i]);}
}
运行结果:
msg[0] = Hell
msg[1] = Hello
msg[2] = World
msg[3] = Judy
5.3 loop
Rust 语言有原生的无限循环结构
fn main() {let msg = ["Hell", "Hello", "World", "Judy", "EOF"];let mut i: usize = 0;loop {let str: &str = msg[i];if str == "EOF" {break i;}println!("msg[{}] = {}", i, str);i += 1;};
}
运行结果:
msg[0] = Hell
msg[1] = Hello
msg[2] = World
msg[3] = Judy
loop 循环可以通过 break 关键字类似于 return 一样使整个循环退出并给予外部一个返回值。因为 loop 这样的循环常被用来当作查找工具使用,如果找到了某个东西当然要将这个结果交出去
fn main() {let msg = ["Hell", "Hello", "World", "Judy", "EOF"];let mut i: usize = 0;let location: usize = loop {let str: &str = msg[i];if str == "EOF" {break i;}i += 1;};println!("\"BOF\" 的索引是 {}", location);
}
运行结果:
"BOF" 的索引是 4
6 所有权
所有权规则
- Rust 中的每个值都有一个变量,称为其所有者。
- 一次只能有一个所有者。(某段内存只能被最后的变量名所有,前面声明过的变量都作废,这有效的避免被多个变量释放的问题,而且该操作是在编译期就可以检查到的,这策略可在编译期就能有效的避免空指针问题。)
- 当所有者不在程序运行范围时,该值将被删除。(Rust对栈内存和堆内存一视同仁,超出作用域一律释放)
7 切片类型
相关文章:
【Rust】速度入门---打印个螃蟹先
参考: 菜鸟教程 1 输出到命令行 这不得打印个螃蟹 // 代码来自官方入门教程 // ferris_say需要另外安装 use ferris_says::say; use std::io::{stdout, BufWriter};fn main() {let stdout: std::io::Stdout stdout();let msg: String String::from("Hello fellow Rusta…...
《Linux 内核设计与实现》12. 内存管理
文章目录 页区获得页获得填充为 0 的页释放页 kmalloc()gfp_mask 标志kfree()vmalloc() slab 层slab 层的设计slab 分配器的接口 在栈上的静态分配单页内核栈 高端内存的映射永久映射临时映射 每个 CPU 的分配新的每个 CPU 接口 页 struct page 结构表示系统中的物理页&#x…...
公司新来个卷王,让人崩溃...
最近内卷严重,各种跳槽裁员,相信很多小伙伴也在准备今年的面试计划。 在此展示一套学习笔记 / 面试手册,年后跳槽的朋友可以好好刷一刷,还是挺有必要的,它几乎涵盖了所有的软件测试技术栈,非常珍贵&#x…...
Docker 安全及日志管理
Docker 安全及日志管理 Docker 容器与虚拟机的区别隔离与共享性能与损耗 Docker 存在的安全问题Docker 自身漏洞Docker 源码问题Docker 架构缺陷与安全机制Docker 安全基线标准 容器相关的常用安全配置方法容器最小化Docker 远程 API 访问控制重启 Docker在宿主机的 firewalld …...
大厂面试必备 - MAC 地址 和 IP 地址分别有什么作用?
数据链路层 1、MAC 地址 和 IP 地址分别有什么作用? MAC 地址是数据链路层和物理层使用的地址,是写在网卡上的物理地址。MAC 地址用来定义网络设备的位置。IP 地址是网络层和以上各层使用的地址,是一种逻辑地址。IP 地址用来区别网络上的计…...
【sqlite】联查Join更新
系列文章 C#底层库–MySQLBuilder脚本构建类(select、insert、update、in、带条件的SQL自动生成) 本文链接:https://blog.csdn.net/youcheng_ge/article/details/129179216 C#底层库–MySQL数据库操作辅助类(推荐阅读࿰…...
asp.net+C#德育课程分数统计管理系统
本中小学德育管理系统主要学校内部提供服务,系统分为管理员,教师和学生3个大模块。 本研究课题重点主要包括了下面几大模块:用户登录,管理员信息管理学生信息管理,教师信息管理,班级成绩管理,学…...
Figma中文网?比Figma更懂你的设计网站!
一个比 Figma 更懂你的设计网站的 Figma 中文网 —— 即时设计是一个非常有用的设计资源平台,它提供了大量的免费设计素材,包括来自各大厂商的 UI 组件库、精美的模板、插画设计和矢量图标素材等等。设计师可以从中学习到大师的设计技巧和规范࿰…...
Nacos-01-Nacos基本介绍
背景 服务发现是⼀个古老的话题,当应用开始脱离单机运行和访问时,服务发现就诞生了。目前的网络架构是每个主机都有⼀个独立的 IP 地址,那么服务发现基本上都是通过某种方式获取到服务所部署的 IP 地址。DNS 协议是最早将⼀个网络名称翻译…...
SpringBoot集成Dubbo启用gRPC协议
文章目录 前言项目结构代码示例父工程api moduleservice module 注意事项区别 本文记录下SpringBoot集成Dubbo启用gRPC协议,以及与原生 gRPC 在代码编写过程中的区别。 下面还有投票,帮忙投个票👍 前言 Dubbo 在 2.7.5 版本开始支持原生 gRP…...
Kali HTTrack演示-渗透测试察打一体(1)
HTTrack是一个免费并易于使用的线下浏览器工具,全称是HTTrack Website Copier for Windows,它能够让你从互联网上下载指定的网站进行线下浏览(离线浏览),也可以用来收集信息(甚至有网站使用隐藏的密码文件),一些仿真度极高的伪网站(为了骗取用户密码),也是使用类似工具做…...
ThreeJS进阶之使用后期处理
什么是后期处理? 很多three.js应用程序是直接将三维物体渲染到屏幕上的。 有时,你或许希望应用一个或多个图形效果,例如景深、发光、胶片微粒或是各种类型的抗锯齿。 后期处理是一种被广泛使用、用于来实现这些效果的方式。 首先,场景被渲染到一个渲染目标上,渲染目标表示…...
KubeEdge节点分组特性简介
01 边缘应用跨地域部署场景及问题 应用生命周期管理复杂导致运维成本提高 02 边缘节点分组管理 节点分组:将不同地区的边缘节点按照节点组的形式组织 边缘应用:将应用资源整体打包并满足不同节点组之间的差异化部署需求 流量闭环:将服务流量…...
论文笔记_2018_IEEE Access_评估地图用于车辆定位能力的因素
目录 基本情况 摘要 I. 引言 II. 相关工作 III. 地图评估标准的定义 A.地图的特...
YOLOv8 人体姿态估计(关键点检测) python推理 ONNX RUNTIME C++部署
目录 1、下载权重 2、python 推理 3、转ONNX格式 4、ONNX RUNTIME C 部署 1、下载权重 我这里之前在做实例分割的时候,项目已经下载到本地,环境也安装好了,只需要下载pose的权重就可以 2、python 推理 yolo taskpose modepredict model…...
AgilePLM 通用自动赋值程序 安装使用说明
功能概述 首先,简单介绍一下自动赋值的意思。就是程序根据给定的条件,给某一个数据对象的某个字段自动填值。 类似功能单独定制开发写程序也能实现。通用赋值程序只是赋值规则简化到了配置文件中。后续如果赋值规则变更,只需要修改配置文件…...
小数转整数的情况
小数转整数的情况 在程序开发中,经常会遇到需要将小数转为整数的情况。但是在转换时需要注意几个问题,本篇博客将详细阐述小数转整数的注意事项。 直接赋值 在C语言中,将一个小数赋值给整型变量时,会直接舍弃小数部分。比如&am…...
05-Docker安装Mysql、Redis、Tomcat
Docker 安装 Mysql 以安装 Mysql 5.7为例: docker pull mysql:5.7Mysql 单机 Mysql 5.7安装 启动 Mysql 容器,并配置容器卷映射: docker run -d -p 3306:3306 \--privilegedtrue \-v /app/mysql/log:/var/log/mysql \-v /app/mysql/data:…...
Docker Overlay2占用大量磁盘空间解决
问题 最近项目的jenkins编译时报错 FATAL: Unable to produce a script filejava.io.IOException: No space left on deviceat java.io.UnixFileSystem.createFileExclusively(Native Method)at java.io.File.createTempFile(File.java:2024)at hudson.FilePath$CreateTextTem…...
2023年免费自动养站程序
什么是养站?SEO是与搜索引擎建立信任的过程,养站不仅仅是建立一个网站,还需要我们不断的更新和维护,才能使网站长时间稳定运行并获得更好的排名。今天跟大家分享如何建站以及如何养站。 一、明确TDK 在设计网站时,我…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门  支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
