Rust 基础语法学习
Rust 基础语法学习
文章目录
- Rust 基础语法学习
- hello world
- 变量
- 数据类型
- 整数类型
- 进制表示方法
- 浮点数类型
- 布尔类型
- 字符类型
- 字符串
- 复合类型
- 元组
- 结构体
- 元组结构体
- 切片类型
- 字符串切片
- 数组切片
- 不可变变量与可变变量
- 常量
- 注释
- 函数
- 语句与表达式
- 流程控制语句
- if else条件判断
- while循环
- loop循环
- for循环
- if let 条件表达式
- match-arm表达式
hello world
rust中的程序从main函数作为入口,hello rust!
fn main() {println!("hello world!");// println!是宏
}
变量
使用let关键字定义变量:
let k = 1;//定义整数变量 k
rust是强类型的,但声明是可以不写明类型,会自动推导类型。
如果要加入数据类型,也可以使用下面方式:
let k:i32 = 1;// k为i32类型整数
数据类型
整数类型
按照比特位长度和有无符号分类:
| bit-length | unsigned | signed |
|---|---|---|
| 8 | u8 | i8 |
| 16 | u16 | i16 |
| 32 | u32 | i32 |
| 64 | u64 | i64 |
| 128 | u128 | i128 |
| 根据平台、架构决定 | usize | isize |
这种类型命名方式非常直观,看到类型即可知道数据长度。
进制表示方法
十进制:12_345
16进制:0xff
八进制:0o77
二进制:0b1010_0101
使用下划线避免了数0的麻烦,非常直观。
浮点数类型
根据bit位数,分32位、64位浮点数,使用f32、f64表示。使用let声明浮点数,默认使用更高精度的f64。
let f = 1.0; //f64
let f:f32 = 1.0;// 声明 f32类型变量
布尔类型
使用bool关键字声明布尔变量,值为true或false。
let bl = true;
let bl = false;
字符类型
在 Rust 中,字符类型是 char。char 类型表示一个 Unicode 标量值(Unicode Scalar Value),它占用 4 个字节(32 位)。Unicode 标量值是 Unicode 编码中的第一个级别,它包括了符号、文字、数字、标点符号、控制符和其他字符等,涵盖了世界上大部分使用的语言和符号。
fn main() {let c1 = 'a';let c2 = 'α';let c3 = '😄';println!("char: {} {} {}", c1, c2, c3);
}
字符串
String 是一种可变的字符串类型,它可以动态地分配内存以容纳字符串数据,并且可以在运行时修改字符串内容。
创建字符串,如:
let mut my_string = String::new();//空字符串
let my_string = String::from("hello world");
复合类型
元组
在Rust中,允许将多个不同类型的值组合成一个单独的复合值,这种类型称为“元组”。
如:
let tuple_demo = ("1+1 =", 2, "is", true);
访问元组的方法:使用.x,x为元素索引。
println!("{} {} {} {}", tuple_demo.0, tuple_demo.1, tuple_demo.2, tuple_demo.3);
元组一旦定义就不能修改元素。
结构体
rust结构体定义:
struct 结构体名称{成员1: 成员1类型,成员2: 成员2类型,...
}
如定义一个student结构体,用于表述学生信息:
struct Student {name: String,//姓名id: u32,//学号age: u32//年龄
}
初始化
一般的初始化方法如下,使用key-value格式:
let student = Student {name: String::from("zhangsan"),id: 001,age: 16 };
可以使用外部同名变量进行快速初始化:
fn main() {let name = String::from("lisi");let id:u32 = 001;let student = Student {name,id,age: 16 };println!("student info: {:?}", student);
}
也可以使用外部存在的同类型结构体变量,更新其余成员:
fn main() {let student = Student {name: String::from("xiaowang"),id: 001,age: 16 };let name = String::from("wangwu");let id = 002;let new_student = Student {name,//使用外部name、id变量初始化id,..student//其余部分使用student变量一次性初始化};println!("new_student info: {:?}", new_student);
}
元组结构体
元组结构体是一种没有具体字段名的结构体,它的字段只有类型而没有字段名。这使得它在表示简单的数据组合时非常有用。
struct Point2D(i32, i32);fn main() {let point = Point2D(10, 20);println!("X: {}, Y: {}", point.0, point.1);
}
切片类型
切片(slice)是对集合(数组、向量等)的连续部分进行引用的数据类型。它们允许以安全且高效的方式操作和访问集合的子集,而无需复制数据。
切片由两个主要部分组成:指向数据的指针和切片的长度。切片语法:
let slice: &[T] = &data[start..end];
字符串切片
直接上代码领悟:
fn main() {let str_demo = String::from("hello world");let str1 = &str_demo[..5]; /* 取0~4 */let str2 = &str_demo[6..11];/* 取6~10 */let str3 = &str_demo[6..]; /* 从第6个开始,取到最后一个 */let str4 = &str_demo[..]; /* 从头到尾 */println!("str1: {}, str2: {}, str3: {}, str4: {}", str1, str2, str3, str4);// str1: hello, str2: world, str3: world, str4: hello world
}
数组切片
fn main() {let array = [0, 1, 2, 3, 4, 5];let array_part1 = &array[0..1]; /* 0 */let array_part2 = &array[..3]; /* 0 1 2 */let array_part3 = &array[3..]; /* 3 4 5 */let array_all = &array[..]; /* all */println!(" &array[0..1]= {:?},&array[..3] = {:?},&array[3..] = {:?},&array[..] = {:?}", array_part1, array_part2, array_part3, array_all);/* output&array[0..1]= [0],&array[..3] = [0, 1, 2],&array[3..] = [3, 4, 5],&array[..] = [0, 1, 2, 3, 4, 5]*/
}
不可变变量与可变变量
使用let单独声明的变量是不可变变量,声明后值无法修改。如果要声明一个值可以修改的变量,需要加入mut关键字,来表示变量可变的(mutable)。
fn main() {let a = 1;//a此后无法修改let mut b = 2;//b可以修改a = 2;//编译会出错b = 3;//mut变量是可变的
}
常量
使用const关键字声明常量,rust中要求常量必须使用全部大写字母表示,并使用下划线分割。否则会有编译警告。
const PI_VAL:f64 = 3.1415926;
注释
- 代码注释:与C语言相同,使用//表示单行注释,/**/表示多行注释。
- 文档注释,使用///在文档开头,使用这种注释方式,可以在导出程序说明文档更方便。
/// 将字符串转换成大写字母,并返回
///
/// # Examples
///
/// ```
/// let s = "hello world";
/// assert_eq!("HELLO WORLD", to_uppercase(s));
/// ```
fn to_uppercase(s: &str) -> String {s.to_uppercase()
}
函数
基本形式:
fn add2number(arg1: i32, arg2: i32) -> i32 {println!("{}+{} = {}", arg1, arg2, arg1+arg2);return arg1+arg2;
}
对于RUST,函数包含参数时,必须标明类型。
需要返回值时,使用 -> 在声明后表明返回值类型。
语句与表达式
rust函数由语句和表达式构成。
语句没有返回值,语句通常是执行某些操作、没有返回值的,如一些变量声明,如:
let a = 1;
表达式有计算步骤且有返回值,如:
a = 7
b + 2
c * (a + b)
通过表达式的返回值,可以直接传递到函数返回值,如:
fn add2number(arg1: i32, arg2: i32) -> i32 {println!("{}+{} = {}", arg1, arg2, arg1+arg2);arg1+arg2
}
arg1+arg2是一个表达式,它的返回值直接传递到函数返回值,不用再写return。
流程控制语句
if else条件判断
示例:
fn main() {let a = 3;if a > 2 {println!("a is greater than 2");} else if a < 2 {println!("a is less than 2");} else {println!("a is equal to 2");}
}
while循环
先判断再执行循环体代码:
fn main() {let mut count = 0;while count < 10 {count += 1;}println!("Count is {}", count);
}
loop循环
loop先执行函数体代码,在函数体中可以判断进行break 退出循环。
fn main() {let mut count = 0;loop {count += 1;if count > 10 {break;}}println!("Count is {}", count);
}
for循环
用于遍历或迭代某些集合类型数据。
fn main() {let arr: [i32; 5] = [1, 2, 3, 4, 5];// 遍历打印数组中的每个元素for num in &arr {println!("{}", num);}
}
if let 条件表达式
有点像c中的三目运算符:
fn main() {let condition = true;let number = if condition { 5 } else { 6 };print!("The value of number is: {}", number);
}
match-arm表达式
match-arm用于匹配,与很多语言中的switch-case类似。
基本语法:
match <var> {type1 => { /*do-something*/ },type2 => { /*do-something*/ },...
}
所谓arm就是match表达式内的不同分支情况。
常用在枚举类型的匹配中,简单使用下:
enum Color{// 颜色枚举Red,/* 红色 */Green,/* 绿色 */Blue,/* 蓝色 */
}
fn main() {let ocean_color = Color::Blue;match ocean_color {Color::Blue => {/* 匹配蓝色 */println!("Ocean is blue");}_ => {/* 匹配其他 */println!("Special Ocean");}}
}
相关文章:
Rust 基础语法学习
Rust 基础语法学习 文章目录 Rust 基础语法学习hello world变量数据类型整数类型进制表示方法浮点数类型布尔类型字符类型字符串复合类型元组结构体元组结构体 切片类型字符串切片数组切片 不可变变量与可变变量常量注释函数语句与表达式 流程控制语句if else条件判断while循环…...
iOS开发Swift-函数
1.函数的定义和调用 func greet(person: String) -> String { // 函数名 传入值 传入值类型 返回值类型let greeting "Hello" personreturn greeting } print( greet(person: "Anna") ) //调用2.函数的参数与返回值 (1)无参函数 func sayHe…...
序列化协议:JSON和XML
作者:CARROT 链接:https://www.zhihu.com/question/604811576/answer/3100483698 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 json和xml都是数据传输的格式。比如我们开发过程中需要和网…...
江西萍乡能源石油化工阀门三维扫描3d测量抄数建模-CASAIM中科广电
长期以来,石油天然气、石油石化、发电和管道输送行业在环保、健康和安全保障方面一直承受着巨大的压力,他们必须确保相关规程在各项作业中得到全面贯彻。 阀门作为流体管道运输中的组成部分,其装配密封度是保证流体运输安全的重要一环&#…...
Go【gin和gorm框架】实现紧急事件登记的接口
简单来说,就是接受前端微信小程序发来的数据保存到数据库,这是我写的第二个接口,相比前一个要稍微简单一些,而且因为前端页面也是我写的,参数类型自然是无缝对接_ 前端页面大概长这个样子 先用apifox模拟发送请求测试…...
第一个VUE程序?
<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title></head> <body><div id"app">{{message}} </div><!-- 1.导入Vue.js --> <script s…...
电阻器件的分类
电阻器的种类碳膜电阻膜式电阻器中的一种。气态碳氢化合物在高温和真空中分解,碳沉积在瓷棒或者瓷管上,形成一层结晶碳膜。改变碳膜厚度和用刻槽的方式变更碳膜的长度可以得到不同的阻值。碳膜电阻成本较低,电性能和稳定性较差,一…...
QT基础教程之二 第一个Qt小程序
QT基础教程之二 第一个Qt小程序 按钮的创建 在Qt程序中,最常用的控件之一就是按钮了,首先我们来看下如何创建一个按钮 QPushButton * btn new QPushButton; 头文件 #include <QPushButton>//设置父亲btn->setParent(this);//设置文字btn-&g…...
Edge用户数据目录查找
创建 Microsoft Edge 用户数据目录变量...
最新外卖霸王餐小程序、H5、微信公众号版外卖系统源码|霸王餐美团/饿了么系统/外卖红包cps粉丝裂变玩法源码下载
最新外卖霸王餐小程序、H5、微信公众号版外卖系统源码、霸王餐美团、饿了么系统,粉丝裂变玩源码下载,外卖cps小程序项目,外卖红包cps带好友返利佣金分销系统程序、饿了么美团联盟源码,外卖cps带分销返利后端源码,基于L…...
数据库事务四大特性
事务的4大特性(ACID): 原子性(Atomicity): 事务是数据库的逻辑工作单位,它对数据库的修改要么全部执行,要么全部不执行。 一致性(Consistemcy): 事务前后,数据库的状态都满足所有的完…...
浅谈Router和Route
router 和 route 是在前端框架中用于管理和处理路由的两个关键概念。这两者之间的关系可以通过具体的代码来解释。在本示例中,我将使用 React 和 React Router 来说明它们之间的关系。 Router(路由器):Router 是一个库或框架&…...
Linux环境安装jdk
1.安装jdk 上传jdk.tar.gz;安装包在下载内容里可以直接下载tar -zxvf jdk.tar.gz;配置环境变量:vi /etc/profile;填入以下内容;退出编辑模式,保存;然后source /etc/profile使配置生效; export JAVA_HOME/d…...
数据隐私与安全在大数据时代的挑战与应对
文章目录 数据隐私的挑战数据安全的挑战应对策略和方法1. 合规和监管2. 加密技术3. 匿名化和脱敏4. 安全意识培训5. 隐私保护技术 结论 🎈个人主页:程序员 小侯 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏 ✨收录专栏&…...
vue3 基础知识 (生命周期) 06
你好! 文章目录 一、生命周期二、生命周期过程三、组件的 v-model 一、生命周期 每个组件都可能从 创建、挂载、更新、卸载 等一系列的过程 在这个过程中的某一个阶段,用于可能会想要 添加一些属于自己的代码逻辑(比如组件创建完成后请求一些…...
【Eclipse】汉化简体中文教程(官方汉化包,IDE自带软件安装功能),图文详情
目录 0.环境 1.步骤 1)查看eclipse的版本 2)在官网找语言包,并复制链接 3)将链接复制到eclipse中 4)汉化完成 0.环境 windows11,64位; eclipse 2021-6版本 1.步骤 思路:在官网找…...
Kotlin协程flow的debounce参数timeoutMillis特性
Kotlin协程flow的debounce参数timeoutMillis特性 <dependency><groupId>org.jetbrains.kotlinx</groupId><artifactId>kotlinx-coroutines-core</artifactId><version>1.7.3</version><type>pom</type></dependency&…...
oracle 12c怎样修改varchar2允许的最大长度
12C单实例测试,varchar2在早期版本中最大长度限制为4000,当字段长度指定的比较长的时候会报错:ORA-00910: specified length too long for its datatype。 早期版本中虽然SQL数据类型限制为4000(如表中的列的varchar2类型&#x…...
python WSGI和ASGI的区别
用户到我们web应用中间经过的相关协议,具体介绍和pyhton相关的WSGI和ASGI,我先把结论列出来,详细描述请看下面介绍! 请大家先记住这张图,带着问题和整个框架去看比较易于了解 CGI,WSGI,ASGI、…...
【Golang】什么是内存逃逸?
文章目录 要从C/C谈起Golang的内存逃逸 要从C/C谈起 在C/C中,局部变量被分配到栈区,一旦当前函数执行完毕,局部变量占用的内存也将被释放,因此以下代码无法将数组的内容传递出去。 int *getArray() {int array[7] {1, 2, 3, 4,…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...
