Rust 基础语法与常用特性
Rust 跨界:全面掌握跨平台应用开发
第一章:快速上手 Rust
1.2 基础语法与常用特性
1.2.1 数据类型与控制流
数据类型
Rust 提供了丰富的内置数据类型,主要分为标量类型和复合类型。
标量类型
标量类型表示单一的值,Rust 中的标量类型包括:
-
整数类型:Rust 提供了多种整数类型,分为有符号和无符号两类。它们的大小可以是 8、16、32、64 或 128 位。
- 有符号整数:
i8
,i16
,i32
,i64
,i128
- 无符号整数:
u8
,u16
,u32
,u64
,u128
- 默认类型:如果没有指定,整数默认类型为
i32
。
示例代码:
let a: i32 = -10; // 有符号整数 let b: u32 = 20; // 无符号整数
- 有符号整数:
-
浮点数类型:Rust 支持
f32
和f64
两种浮点数,分别表示 32 位和 64 位浮点数。浮点数使用f
后缀来指示类型。示例代码:
let x: f32 = 3.14; // 32位浮点数 let y: f64 = 2.71828; // 64位浮点数
-
布尔类型:布尔类型只有两个值:
true
和false
。示例代码:
let is_active: bool = true;
-
字符类型:字符类型表示一个 Unicode 字符,使用单引号定义,支持多种语言的字符。
示例代码:
let letter: char = 'A'; let emoji: char = '😊';
复合类型
复合类型用于将多个值组合在一起,主要有元组和数组。
-
元组:元组可以存储不同类型的值,使用小括号定义。元组的大小是固定的,定义后不可更改。
示例代码:
let person: (&str, i32) = ("Alice", 30); // (名字, 年龄) let coordinates: (f64, f64) = (10.0, 20.0); // (x, y)
访问元组中的元素时,可以使用点语法:
let (name, age) = person; println!("Name: {}, Age: {}", name, age);
-
数组:数组用于存储同一类型的多个值,使用方括号定义。数组的长度是固定的,定义后不可更改。
示例代码:
let numbers: [i32; 5] = [1, 2, 3, 4, 5]; // 长度为5的整数数组 let first = numbers[0]; // 访问数组元素
Rust 还支持使用
vec!
宏创建动态数组(向量):let mut dynamic_numbers = vec![1, 2, 3]; dynamic_numbers.push(4); // 添加新元素
控制流
Rust 提供了多种控制流结构,包括条件语句、循环等。
条件语句
使用 if
和 else
进行条件判断,Rust 支持多种条件语句结构。
-
基本
if
语句示例代码:
let score = 85;if score >= 90 {println!("Grade: A"); } else if score >= 80 {println!("Grade: B"); } else {println!("Grade: C"); }
-
条件表达式
Rust 的
if
语句可以作为表达式,返回值。示例代码:
let max = if a > b { a } else { b };
-
模式匹配
使用
match
语句进行复杂的条件判断和模式匹配。示例代码:
match score {90..=100 => println!("Grade: A"),80..=89 => println!("Grade: B"),_ => println!("Grade: C"), }
循环
Rust 提供了 loop
、while
和 for
三种循环结构。
-
无限循环
使用
loop
关键字创建无限循环,通常配合break
使用。示例代码:
let mut count = 0;loop {count += 1;if count > 5 {break; // 结束循环}println!("Count: {}", count); }
-
while
循环while
循环在条件为真时执行。示例代码:
let mut count = 0;while count < 5 {println!("Count: {}", count);count += 1; }
-
for
循环for
循环用于遍历集合(如数组、切片、范围等)。示例代码:
let array = [1, 2, 3, 4, 5];for number in array.iter() {println!("Number: {}", number); }// 使用范围 for i in 1..=5 {println!("Count: {}", i); }
1.2.2 函数与模块
函数
Rust 的函数定义非常灵活,支持参数、返回值、可变参数等。
定义函数
函数使用 fn
关键字定义,支持参数类型和返回值类型。
示例代码:
fn add(a: i32, b: i32) -> i32 {a + b
}
调用函数
调用函数时,传入参数并获取返回值。
示例代码:
let result = add(2, 3);
println!("Result: {}", result);
可变参数函数
Rust 支持可变参数函数,可以使用切片作为参数类型。
示例代码:
fn print_numbers(numbers: &[i32]) {for &number in numbers.iter() {println!("{}", number);}
}
匿名函数
Rust 还支持匿名函数(闭包),可以作为参数传递。
示例代码:
let add = |a: i32, b: i32| a + b;
let result = add(5, 10);
println!("Result: {}", result);
模块与包
Rust 使用模块系统来组织代码。模块是一个代码的集合,可以将相关的功能分组在一起。
定义模块
使用 mod
关键字定义模块。
示例代码:
mod math {pub fn multiply(a: i32, b: i32) -> i32 {a * b}
}// 在其他地方调用模块中的函数
let product = math::multiply(4, 5);
println!("Product: {}", product);
模块中的子模块
模块可以包含其他子模块,使用 {}
包围子模块。
示例代码:
mod outer {pub mod inner {pub fn inner_function() {println!("This is an inner function.");}}
}outer::inner::inner_function();
包的概念
包是 Rust 项目的基本构建块,包含多个模块和库。通过 Cargo.toml
文件管理包的依赖和配置。
1.2.3 错误处理
Rust 提供了强大的错误处理机制,主要通过 Result
和 Option
类型实现。
使用 Result
类型
Result
是一个枚举,表示操作的成功或失败。它有两个变体:Ok
和 Err
。
示例代码:
fn divide(a: f64, b: f64) -> Result<f64, String> {if b == 0.0 {Err(String::from("Cannot divide by zero"))} else {Ok(a / b)}
}// 调用函数并处理结果
match divide(10.0, 2.0) {Ok(result) => println!("Result: {}", result),Err(e) => println!("Error: {}", e),
}
使用 Option
类型
Option
用于表示可能存在或不存在的值,包含两个变体:Some
和 None
。
示例代码:
fn find_item(index: usize) -> Option<&'static str> {let items = ["Apple", "Banana", "Cherry"];if index < items.len() {Some(items[index])} else {None}
}// 调用函数并处理结果
match find_item(1) {Some(item) => println!("Found: {}", item),None => println!("Item not found"),
}
1.2.4 泛型与特征
泛型允许我们在函数和数据结构中使用占位符类型,使代码更加灵活。
定义泛型函数
示例代码:
fn print_item<T: std::fmt::Display>(item: T) {println!("Item: {}", item);
}
使用特征
特征定义了一组方法,可以被不同类型实现。
示例代码:
trait Describe {fn describe(&self) -> String;
}struct Dog;impl Describe for Dog {fn describe(&self) -> String {String::from("This is a dog.")}
}let dog = Dog;
println!("Dog: {}", dog.describe());
特征约束
特征约束用于限制泛型类型的行为。
示例代码:
fn print_and_describe<T: Describe>(item: T) {println!("Description: {}", item.describe());
}
1.2.5 宏的使用
Rust 支持宏,可以用来简化代码。
定义宏
使用 macro_rules!
定义宏。
示例代码:
macro_rules! say_hello {() => {println!("Hello, Macro!");};
}fn main() {say_hello!(); // 调用宏
}
带参数的宏
可以定义带参数的宏来处理更复杂的逻辑。
示例代码:
macro_rules! create_function {($func_name:ident) => {fn $func_name() {println!("Function {:?} created!", stringify!($func_name));}};
}create_function!(foo); // 创建函数 foofn main() {foo(); // 调用 foo 函数
}
使用宏生成代码
宏可以动态生成代码,以减少重复代码。
示例代码:
macro_rules! generate_struct {($name:ident) => {struct $name {value: i32,}};
}generate_struct!(MyStruct); // 生成结构体 MyStructfn main() {let instance = MyStruct { value: 10 };println!("Value: {}", instance.value);
}
小结
本节详细介绍了 Rust 的基本语法和常用特性,包括数据类型、控制流、函数、模块、错误处理、泛型、特征和宏的使用。通过丰富的示例代码,您可以更深入地理解这些特性在实际开发中的应用。
相关文章:
Rust 基础语法与常用特性
Rust 跨界:全面掌握跨平台应用开发 第一章:快速上手 Rust 1.2 基础语法与常用特性 1.2.1 数据类型与控制流 数据类型 Rust 提供了丰富的内置数据类型,主要分为标量类型和复合类型。 标量类型 标量类型表示单一的值,Rust 中…...
一、开发环境的搭建
环境搭建步骤: 下载软件安装软件运行软件 其他: Visual studio 安装包文件:https://www.alipan.com/s/nd5RgzD4e3b 下载软件 在浏览器中搜索Visual studio,选择如图的选项 点击该区域,进入该页面,【或…...
Docker:存储原理
Docker:存储原理 镜像联合文件系统overlay镜像存储结构容器存储结构 存储卷绑定挂载存储卷结构 镜像 联合文件系统 联合文件系统Union File System是一种分层,轻量且高效的文件系统。其将整个文件系统分为多个层,层与层之间进行覆盖&#x…...
ts:数组的常用方法(push、pop、shift、unshift、splice、slice)
前端css中filter的使用 一、主要内容说明二、例子(一)、push方法(尾添加)1.源码1 (push方法)2.源码1运行效果 (二)、pop方法(尾删除)1.源码2(pop方…...
物联网网关确保设备安全
物联网(IoT)网关在确保设备安全方面扮演着至关重要的角色。 作为连接物联网设备和云端或企业系统的中介,物联网网关可以实施多种安全措施来保护设备和数据。 是物联网网关确保设备安全的关键方法: 1. 设备认证和授权 认证&…...
Vue学习笔记(五)
Class绑定 数据绑定的一个常见需求场景式操纵元素的CSS class列表,因为class是attribute,我们可以和其他attribute一样使用v-bind将它们和动态的字符串绑定。但是,在处理比较复杂的绑定时,通过拼接生成字符串是麻烦且易出错的。因此…...
Nestjs返回格式小结
在 NestJS 中,除了 text/event-stream(用于 Server-Sent Events)之外,还有多种格式的返回方式,具体取决于你的应用需求。以下是一些常见的返回格式及其示例: 1. JSON 格式 Get(json) getJsonResponse(Res…...
【力扣刷题实战】相同的树
大家好,我是小卡皮巴拉 文章目录 目录 力扣题目: 相同的树 题目描述 示例 1: 示例 2: 示例 3: 解题思路 题目理解 算法选择 具体思路 解题要点 完整代码(C语言) 兄弟们共勉 &#…...
Golang | Leetcode Golang题解之第515题在每个树行中找最大值
题目: 题解: func largestValues(root *TreeNode) (ans []int) {if root nil {return}q : []*TreeNode{root}for len(q) > 0 {maxVal : math.MinInt32tmp : qq nilfor _, node : range tmp {maxVal max(maxVal, node.Val)if node.Left ! nil {q …...
Zookeeper 对于 Kafka 的作用是什么?
大家好,我是锋哥。今天分享关于【Zookeeper 对于 Kafka 的作用是什么?】面试题?希望对大家有帮助; Zookeeper 对于 Kafka 的作用是什么? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 ZooKeeper 在 Kafka…...
Thread类及线程的核心操作
一. Thread类的常见构造方法 1. Thread() Thread类无参的构造方法, 用于创建Thread类的实例对象. 2. Thread(String name) 带一个参数的Thread类构造方法, 创建一个线程对象, 并给其命名. [注]: 如果不专门给线程命名, 那么线程默认的名字就是Thread-0, Thread-1, Thread-…...
算法|牛客网华为机试11-20C++
牛客网华为机试 上篇:算法|牛客网华为机试1-10C 文章目录 HJ11 数字颠倒HJ12 字符串反转HJ13 句子逆序HJ14 字符串排序HJ15 求int型正整数在内存中存储时1的个数HJ16 购物单HJ17 坐标移动HJ18 识别有效的IP地址和掩码并进行分类统计HJ19 简单错误记录HJ20 密码验证…...
OpenAI低调发布多智能体工具Swarm:让多个智能体协同工作!
大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,专注于分享AI全维度知识,包括但不限于AI科普,AI工…...
性能之光 年度电竞性能旗舰iQOO 13发布
2024年10月30日,被定义为“性能之光”的年度电竞性能旗舰——iQOO 13正式发布,售价3999元起。iQOO 13作为iQOO 品牌在性能上的又一次深入探索,它像是一束光,引领行业不断拉高性能上限,让用户看到更多的可能性。 iQOO …...
如何避免因不熟悉数据保护法规而受损
在当今数字化时代,数据保护法规的遵守对于企业至关重要。不熟悉新的数据保护法规会导致法律风险增加、财务损失、声誉受损、客户信任下降等多方面的负面影响。其中,法律风险增加尤为严重,因为不符合规定可能引发高额罚款和法律诉讼。企业若未…...
LLaMA Factory 核心原理讲解
大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于大模型算法的研究与应用。曾担任百度千帆大模型比赛、BPAA算法大赛评委,编写微软OpenAI考试认证指导手册。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。授权多项发明专利。对机器学…...
Java题集练习5
Java题集练习5(集合) 1.三种集合差别,集合类都是什么,数据结构是什么,都什么时候用 三者关系 Set集合 Set接口是Collection接口的一个子接口是无序的,set中不包含重复的元素,也就是说set中不…...
操作系统学习笔记-2.3哲学家和管程问题
哲学家问题 问题描述 假设有五位哲学家围坐在一张圆桌旁,每位哲学家面前放有一盘意大利面,他们各自间隔放置一根叉子。哲学家的行为分为“思考”和“进餐”两种状态。为了进餐,哲学家需要同时拿起左手边和右手边的两根叉子。用餐结束后&…...
2023年信息安全工程师摸底测试卷
目录 1.密码算法 2.等级保护 3.密码学 4.安全评估 5.网络安全控制技术 6.恶意代码 7.身份认证 8.资产管理 9.密码分类 10.被动攻击 11.商用密码服务编辑 12.超文本传输协议 13.数字水印技术 14.信息系统安全设计 15.重放攻击 16.信息资产保护 17.身份认证 …...
ReactOS系统中平衡二叉树。给定地址超导其所属区块MmFindRegion()
系列文章目录 PMM_REGION NTAPI MmFindRegion( PVOID BaseAddress, PLIST_ENTRY RegionListHead, PVOID Address, PVOID* RegionBaseAddress ); 宏函数 //给定地址找到其中所属区块 #define CONTAINING_RECORD(address,type,field) ((type FAR *\(PCHAR)(address)-(PCHAR)(&…...
基于TESSY的单元测试与分类树方法深入解析
在现代软件开发中,单元测试是确保软件质量和可靠性的关键步骤之一。特别是对于嵌入式软件,由于其应用环境的特殊性和高安全性要求,单元测试显得尤为重要。本文将基于《TESSY 用户手册》的内容,详细介绍如何使用TESSY 进行单元测试,并深入探讨分类树方法(Classification T…...
整理了一些大模型的课程,非常详细,大模型零基础入门到精通,收藏我这一篇就够了
目前有多个科普类的大模型课程,这些课程涵盖了从基础理论到实际应用的各个方面。以下是一些主要的科普类大模型课程:复旦大学“大模型开发与赋能”专题讲习班:由复旦大学计算机学院邱锡鹏教授带来的《大模型科普讲解》课程,通过深…...
区块链国赛题目--食品溯源(模块三)
区块链国赛题目–食品溯源(模块三) 任务 3-1:区块链应用前端功能开发 1.请基于前端系统的开发模板,在登录组件 login.js、组件管理文件components.js 中添加对应的逻辑代码,实现对前端的角色选择功能,并测试功 能完整性,示例页面如下: 具体要求如下: (1)有明…...
【Searxng】Searxng docker 安装
SearXNG将用户的查询请求分发至多个支持的搜索引擎,并收集返回的结果进行汇总处理。在这个过程中,它通过内置的过滤器功能屏蔽广告和其他不相关内容,确保搜索结果的纯净度。 一键部署 docker run \--name searxng \-p ????:8080 \-v ~/s…...
Java Lock/AQS ReentrantLock 源码
前言 相关系列 《Java & Lock & 目录》(持续更新)《Java & AQS & 目录》(持续更新)《Java & Lock/AQS & ReentrantLock & 源码》(学习过程/多有漏误/仅作参考/不再更新)《Jav…...
魔法伤害--是谁偷走了我的0
起因:需要迁移数据进行数据更新,使用pandasorcal进行数据处理以及库迁移 首先把数据导出为xls格式数据文件,使用python import pandas as pdnew_obj pd.read_excel(ne,dtype{DAY: str, MONTH: str}) 原有导出数据格式为: 使用…...
【ArcGIS Pro实操第4期】绘制三维地图
【ArcGIS Pro实操第4期】绘制三维地图 ArcGIS Pro绘制三维地图-以DEM高程为例参考 如何使用ArcGIS Pro将栅格数据用三维的形式进行表达?在ArcGIS里可以使用ArcScene来实现,ArcGIS Pro实现原理跟ArcScene一致。由于Esri未来将不再对ArcGIS更新,…...
Vuestic 整理使用
简单示例 1. 条件渲染 2. 列表渲染 3. 组件插槽 4. 插值语法 5. 前后端路由的区别(还是转一下,可以减少代码量)SFC 构建 … … Okay,可以干活了,通顺 数据表的操作更加简化了 数据类别通过后端路由区别,但是还得由前端路由转一下 简单了许多呀,上脚手…...
学习伊圣雨老师的 epoll 编程
(1)书里提出了疑问,epoll 函数的工作方式,区分为水平触发与边缘触发 : (2) 谢谢...
详细了解C++11(1)
大家好呀,我是残念,希望在你看完之后,能对你有所帮助,有什么不足请指正!共同学习交流哦 本文由:残念ing原创CSDN首发,如需要转载请通知 个人主页:残念ing-CSDN博客,欢迎各…...
企业网站营销的成功案例/百度一下免费下载安装
如题。 之前是IE7时正常,装IE8后在VS2005中按F5正常启动,但是打开IE之后VS2005自动回到非调试状态。 在调试菜单中“附加到进程”中附加到WebDev.WebServer.EXE倒是可以,不知道是怎么回事。 转载于:https://www.cnblogs.com/chinhr/archive/2…...
东莞网站se/seo网络推广什么意思
处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及 Full GC 次数过多的问题。 当然,这些问题最终导致的直观现象就是系统运行缓慢,并且有大量的报警。 本文主要针对系统运行缓慢这一问题,提供该问题…...
建设电影网站选服务器怎么选/中国网评中国网评
记录游戏引擎开发...
把网站内容全删掉 在重新建立会不会被k/宁波网站推广优化
Google Cloud SQL是个易于使用的服务,它会向客户提供完全托管的MySQL数据库。你可以将那些常规性、但又很必要,而且很耗时的任务(比如说应用补丁与更新、管理备份与配置主从复制等)交给Google去做,这样就可以将精力完全…...
做网站的策划书/东营seo网站推广
之前我们已经介绍过怎么把nginx日志同步到kafka,现在我们尝试消费里面的消息并固化到hdfs里面;在实施方案前,假设读者已经熟悉以下技术 (不细说)Java及其Spring框架的基本使用Spark和Spark streaming原理kudu的基本使用方案实施sparkstreamin…...
做赌博网站代理违法吗/业务推广方式有哪些
awk 默认以空格为分割符 倒数第一行 awk ‘{print $(NF)}’ 倒数第二行 awk ‘{print $(NF-1)}’ awk ‘{print $0}’ demo.txt 上面示例中,demo.txt是awk所要处理的文本文件。前面单引号内部有一个大括号,里面就是每一行的处理动作print $0。其中&am…...