【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:if
andelse
have incompatible types
少了else{} 也会报错的
error:if
may be missing anelse
clause
if
expressions withoutelse
evaluate 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 在设计网站时,我…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...

搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...