当前位置: 首页 > news >正文

Rust 基础语法与常用特性

Rust 跨界:全面掌握跨平台应用开发

第一章:快速上手 Rust

1.2 基础语法与常用特性

1.2.1 数据类型与控制流
数据类型

Rust 提供了丰富的内置数据类型,主要分为标量类型和复合类型。

标量类型

标量类型表示单一的值,Rust 中的标量类型包括:

  1. 整数类型: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;  // 无符号整数
    

  2. 浮点数类型:Rust 支持 f32f64 两种浮点数,分别表示 32 位和 64 位浮点数。浮点数使用 f 后缀来指示类型。

    示例代码:

    let x: f32 = 3.14; // 32位浮点数
    let y: f64 = 2.71828; // 64位浮点数
    

  3. 布尔类型:布尔类型只有两个值:truefalse

    示例代码:

    let is_active: bool = true;
    

  4. 字符类型:字符类型表示一个 Unicode 字符,使用单引号定义,支持多种语言的字符。

    示例代码:

    let letter: char = 'A';
    let emoji: char = '😊';

复合类型

复合类型用于将多个值组合在一起,主要有元组和数组。

  1. 元组:元组可以存储不同类型的值,使用小括号定义。元组的大小是固定的,定义后不可更改。

    示例代码:

    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);
    

  2. 数组:数组用于存储同一类型的多个值,使用方括号定义。数组的长度是固定的,定义后不可更改。

    示例代码:

    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 提供了多种控制流结构,包括条件语句、循环等。

条件语句

使用 ifelse 进行条件判断,Rust 支持多种条件语句结构。

  1. 基本 if 语句

    示例代码:

    let score = 85;if score >= 90 {println!("Grade: A");
    } else if score >= 80 {println!("Grade: B");
    } else {println!("Grade: C");
    }
    

  2. 条件表达式

    Rust 的 if 语句可以作为表达式,返回值。

    示例代码:

    let max = if a > b { a } else { b };
    
  3. 模式匹配

    使用 match 语句进行复杂的条件判断和模式匹配。

    示例代码:

    match score {90..=100 => println!("Grade: A"),80..=89 => println!("Grade: B"),_ => println!("Grade: C"),
    }

循环

Rust 提供了 loopwhilefor 三种循环结构。

  1. 无限循环

    使用 loop 关键字创建无限循环,通常配合 break 使用。

    示例代码:

    let mut count = 0;loop {count += 1;if count > 5 {break; // 结束循环}println!("Count: {}", count);
    }

  2. while 循环

    while 循环在条件为真时执行。

    示例代码:

    let mut count = 0;while count < 5 {println!("Count: {}", count);count += 1;
    }

  3. 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 提供了强大的错误处理机制,主要通过 ResultOption 类型实现。

使用 Result 类型

Result 是一个枚举,表示操作的成功或失败。它有两个变体:OkErr

示例代码:

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 用于表示可能存在或不存在的值,包含两个变体:SomeNone

示例代码:

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 跨界&#xff1a;全面掌握跨平台应用开发 第一章&#xff1a;快速上手 Rust 1.2 基础语法与常用特性 1.2.1 数据类型与控制流 数据类型 Rust 提供了丰富的内置数据类型&#xff0c;主要分为标量类型和复合类型。 标量类型 标量类型表示单一的值&#xff0c;Rust 中…...

一、开发环境的搭建

环境搭建步骤&#xff1a; 下载软件安装软件运行软件 其他&#xff1a; Visual studio 安装包文件&#xff1a;https://www.alipan.com/s/nd5RgzD4e3b 下载软件 在浏览器中搜索Visual studio&#xff0c;选择如图的选项 点击该区域&#xff0c;进入该页面&#xff0c;【或…...

Docker:存储原理

Docker&#xff1a;存储原理 镜像联合文件系统overlay镜像存储结构容器存储结构 存储卷绑定挂载存储卷结构 镜像 联合文件系统 联合文件系统Union File System是一种分层&#xff0c;轻量且高效的文件系统。其将整个文件系统分为多个层&#xff0c;层与层之间进行覆盖&#x…...

ts:数组的常用方法(push、pop、shift、unshift、splice、slice)

前端css中filter的使用 一、主要内容说明二、例子&#xff08;一&#xff09;、push方法&#xff08;尾添加&#xff09;1.源码1 &#xff08;push方法&#xff09;2.源码1运行效果 &#xff08;二&#xff09;、pop方法&#xff08;尾删除&#xff09;1.源码2&#xff08;pop方…...

物联网网关确保设备安全

物联网&#xff08;IoT&#xff09;网关在确保设备安全方面扮演着至关重要的角色。 作为连接物联网设备和云端或企业系统的中介&#xff0c;物联网网关可以实施多种安全措施来保护设备和数据。 是物联网网关确保设备安全的关键方法&#xff1a; 1. 设备认证和授权 认证&…...

Vue学习笔记(五)

Class绑定 数据绑定的一个常见需求场景式操纵元素的CSS class列表&#xff0c;因为class是attribute,我们可以和其他attribute一样使用v-bind将它们和动态的字符串绑定。但是&#xff0c;在处理比较复杂的绑定时&#xff0c;通过拼接生成字符串是麻烦且易出错的。因此&#xf…...

Nestjs返回格式小结

在 NestJS 中&#xff0c;除了 text/event-stream&#xff08;用于 Server-Sent Events&#xff09;之外&#xff0c;还有多种格式的返回方式&#xff0c;具体取决于你的应用需求。以下是一些常见的返回格式及其示例&#xff1a; 1. JSON 格式 Get(json) getJsonResponse(Res…...

【力扣刷题实战】相同的树

大家好&#xff0c;我是小卡皮巴拉 文章目录 目录 力扣题目&#xff1a; 相同的树 题目描述 示例 1&#xff1a; 示例 2&#xff1a; 示例 3&#xff1a; 解题思路 题目理解 算法选择 具体思路 解题要点 完整代码&#xff08;C语言&#xff09; 兄弟们共勉 &#…...

Golang | Leetcode Golang题解之第515题在每个树行中找最大值

题目&#xff1a; 题解&#xff1a; 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 的作用是什么?

大家好&#xff0c;我是锋哥。今天分享关于【Zookeeper 对于 Kafka 的作用是什么&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; Zookeeper 对于 Kafka 的作用是什么&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 ZooKeeper 在 Kafka…...

Thread类及线程的核心操作

一. Thread类的常见构造方法 1. Thread() Thread类无参的构造方法, 用于创建Thread类的实例对象. 2. Thread(String name) 带一个参数的Thread类构造方法, 创建一个线程对象, 并给其命名. [注]: 如果不专门给线程命名, 那么线程默认的名字就是Thread-0, Thread-1, Thread-…...

算法|牛客网华为机试11-20C++

牛客网华为机试 上篇&#xff1a;算法|牛客网华为机试1-10C 文章目录 HJ11 数字颠倒HJ12 字符串反转HJ13 句子逆序HJ14 字符串排序HJ15 求int型正整数在内存中存储时1的个数HJ16 购物单HJ17 坐标移动HJ18 识别有效的IP地址和掩码并进行分类统计HJ19 简单错误记录HJ20 密码验证…...

OpenAI低调发布多智能体工具Swarm:让多个智能体协同工作!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…...

性能之光 年度电竞性能旗舰iQOO 13发布

2024年10月30日&#xff0c;被定义为“性能之光”的年度电竞性能旗舰——iQOO 13正式发布&#xff0c;售价3999元起。iQOO 13作为iQOO 品牌在性能上的又一次深入探索&#xff0c;它像是一束光&#xff0c;引领行业不断拉高性能上限&#xff0c;让用户看到更多的可能性。 iQOO …...

如何避免因不熟悉数据保护法规而受损

在当今数字化时代&#xff0c;数据保护法规的遵守对于企业至关重要。不熟悉新的数据保护法规会导致法律风险增加、财务损失、声誉受损、客户信任下降等多方面的负面影响。其中&#xff0c;法律风险增加尤为严重&#xff0c;因为不符合规定可能引发高额罚款和法律诉讼。企业若未…...

LLaMA Factory 核心原理讲解

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于大模型算法的研究与应用。曾担任百度千帆大模型比赛、BPAA算法大赛评委,编写微软OpenAI考试认证指导手册。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。授权多项发明专利。对机器学…...

Java题集练习5

Java题集练习5&#xff08;集合&#xff09; 1.三种集合差别&#xff0c;集合类都是什么&#xff0c;数据结构是什么&#xff0c;都什么时候用 三者关系 Set集合 Set接口是Collection接口的一个子接口是无序的&#xff0c;set中不包含重复的元素&#xff0c;也就是说set中不…...

操作系统学习笔记-2.3哲学家和管程问题

哲学家问题 问题描述 假设有五位哲学家围坐在一张圆桌旁&#xff0c;每位哲学家面前放有一盘意大利面&#xff0c;他们各自间隔放置一根叉子。哲学家的行为分为“思考”和“进餐”两种状态。为了进餐&#xff0c;哲学家需要同时拿起左手边和右手边的两根叉子。用餐结束后&…...

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)(&…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O…...

Modbus RTU与Modbus TCP详解指南

目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...

在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7

在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤&#xff1a; 第一步&#xff1a; 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为&#xff1a; // 改为 v…...