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 的基本语法和常用特性,包括数据类型、控制流、函数、模块、错误处理、泛型、特征和宏的使用。通过丰富的示例代码,您可以更深入地理解这些特性在实际开发中的应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/58542.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【linux】centos编译安装openssl1.1.1

文章目录 背景用途编译安装openssl1.1.1d测试centos的python2 ssl模块是否正常pyenv编译python3.10需要配置环境变量(必须)编译python前记得安装依赖 背景 首先&#xff0c; centos7 通过yum安装的openssl-devel包是1.0.2k的&#xff0c;这玩意儿太老了。我们选择从源码安装op…

视觉目标检测标注xml格式文件解析可视化 - python 实现

视觉目标检测任务&#xff0c;通常用 labelimage标注&#xff0c;对应的标注文件为xml。 该示例来源于开源项目&#xff1a;https://gitcode.com/DataBall/DataBall-detections-100s/overview 读取 xml 标注文件&#xff0c;并进行可视化示例如下&#xff1a; #-*-coding:ut…

E卷-空栈压数

题目描述 向一个空栈压入正整数&#xff0c;每当压入一个整数时&#xff0c;执行以下规则(设:栈顶至栈底整数依次为 n 1 , n 2 , . . . n x n1,n2,... nx n1,n2,...nx&#xff0c;其中 n 1 n1 n1 为最新压入的整数)。 如果 n 1 n 2 n1 n2 n1n2&#xff0c;则 n 1 , n 2…

地理征服营销与开源 AI 智能名片 2 + 1 链动模式 S2B2C 商城小程序的融合创新

摘要&#xff1a;本文探讨了地理征服营销这一创新营销策略与开源 AI 智能名片 2 1 链动模式 S2B2C 商城小程序的融合应用。首先阐述地理征服营销的概念和实施要点&#xff0c;接着介绍开源 AI 智能名片 2 1 链动模式 S2B2C 商城小程序的功能与优势&#xff0c;分析二者结合如…

三周精通FastAPI:24 OAuth2 实现简单的 Password 和 Bearer 验证

官网文档&#xff1a;https://fastapi.tiangolo.com/zh/tutorial/security/simple-oauth2/ OAuth2 实现简单的 Password 和 Bearer 验证 本章添加上一章示例中欠缺的部分&#xff0c;实现完整的安全流。 获取 username 和 password 首先&#xff0c;使用 FastAPI 安全工具获…

字节青训-兔群繁殖之谜

问题描述 生物学家小 R 正在研究一种特殊的兔子品种的繁殖模式。这种兔子的繁殖遵循以下规律&#xff1a; 每对成年兔子每个月会生育一对新的小兔子&#xff08;一雌一雄&#xff09;。新生的小兔子需要一个月成长&#xff0c;到第二个月才能开始繁殖。兔子永远不会死亡。 小 R…

appium自动化对已打开的app操作

一、说明 由于 Appium 4.x 版本对会话的管理方式发生了变化&#xff0c;直接重用会话的功能可能不再支持。你可能需要调整测试策略&#xff0c;采用新的方法与已经打开的应用进行交互&#xff0c;比如使用 ADB&#xff0c;就为了找这个我找了很久网上都没有说明&#xff0c;老…

基于STM32的智能厨房油烟监测与排风系统设计

引言 在日常烹饪过程中&#xff0c;厨房中容易产生大量油烟&#xff0c;长时间积累会对空气质量和墙面产生不良影响&#xff0c;甚至危害人体健康。智能厨房油烟监测与排风系统可以实时监测厨房内的油烟浓度&#xff0c;自动调节排风扇运行&#xff0c;确保空气清新。本文设计…

MiniWord

1.nuget 下载配置 2.引用 3. var value = new Dictionary<string, object>() { ["nianfen"] = nianfen, ["yuefen"] = yuefen, ["yuefenjian1"] = (int.Par…

计算机毕业设计Python+大模型恶意木马流量检测与分类 恶意流量监测 随机森林模型 深度学习 机器学习 数据可视化 大数据毕业设计 信息安全 网络安全

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; Python大模型恶意木马流量检…

04.DDD与CQRS

学习视频来源&#xff1a;DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid1940048&ctype0 文章目录 定义职责分离DDD与CQRS的关系领域模型和查询模型特点命令场景的领域模型查询场景的查询模型 架构方案领域事件方案1&#xff1a…

专业140+总分410+武汉大学807信号与系统考研经验武大原936电子信息与通信工程,真题,大纲,参考书。

考研专业课807信号与系统(原936)140&#xff0c;总分410&#xff0c;顺利被武汉大学录取&#xff0c;群 里不少同学希望总结一下复习经验&#xff0c;回看这一年有得有失&#xff0c;总结一下希望给大家有些参考。考研还需从自身情况出发&#xff0c;制定适合自己的复习计划&am…

Java 定时任务详解

在 Java 应用开发中&#xff0c;定时任务是一项非常常见且重要的功能。它允许我们在特定的时间间隔或特定的时间点执行预先定义好的任务&#xff0c;比如定时备份数据、定时清理缓存、定时发送邮件等。本文将参考javaguide对 Java 定时任务进行详细的讲解。 一、Java 中实现定…

什么是多态?面向对象中对多态的理解

本文原文来自&#xff1a;什么是多态&#xff1f;面向对象中对多态的理解 什么是多态 多态&#xff08;Polymorphism&#xff09;是面向对象编程&#xff08;OOP&#xff09;中的一个核心概念&#xff0c;它允许对象以多种形式出现。多态性使得同一个接口可以用于不同的数据类…

Redisson(二)SpringBoot集成Redisson

目录 一、Redis单例模式 二、Redis哨兵模式 三、Redis集群模式 四、主从模式 五、兼容多种模式的配置&#xff08;重点&#xff09; 1、pom 2、配置文件 &#xff08;1&#xff09;application.properties &#xff08;2&#xff09;application-dev.properties &…

eclipse下载与安装(汉化教程)超详细

目录 一、下载eclipse安装包 三、配置eclipse 代码自动补全功能 安装汉化包 中英文切换 四、用eclipse写hello world 一、下载eclipse安装包 1、首先进入 eclipse官网 如下&#xff1a; 2、这里面有很多版本&#xff1b;我们小白一般选择第二个&#xff0c;向下滑动&…

【Kettle的安装与使用】使用Kettle实现mysql和hive的数据传输(使用Kettle将mysql数据导入hive、将hive数据导入mysql)

文章目录 一、安装1、解压2、修改字符集3、启动 二、实战1、将hive数据导入mysql2、将mysql数据导入到hive 一、安装 Kettle的安装包在文章结尾 1、解压 在windows中解压到一个非中文路径下 2、修改字符集 修改 spoon.bat 文件 "-Dfile.encodingUTF-8"3、启动…

Nop平台核心代码阅读导引

Nop平台核心引擎的实现代码都很简短&#xff0c;一般模块的核心代码量都是5000行左右的量级&#xff0c;只有ORM比较复杂一些&#xff0c;1万多行。 虽然代码很短&#xff0c;实际实现的功能特性却很多&#xff0c;要把所有细节设计都介绍到&#xff0c;文档量还是不小。建议有…

RHCE笔记-DNS服务器

一.DNS简介 DNS&#xff08;域名系统&#xff09;是一种互联网服务&#xff0c;负责将我们熟悉的域名&#xff08;比如 www.example.com&#xff09;转换为计算机能理解的IP地址&#xff08;比如 192.0.2.1&#xff09;。这样&#xff0c;当你在浏览器中输入网址时&#xff0c;…

利用QGIS工具手动绘制线轨迹并生成地理信息geojson文件

前端想要获得一个完整的shp文件或者geojson的地理信息文件&#xff0c;可以利用QGIS工具手动绘制你想要的数据点位&#xff0c;然后导出图层生成对应的文件即可。 1、新建临时图层 选择线图层&#xff0c;点击ok创建临时图层。 2、绘制线图层 在工具栏中选择添加线要素&#…