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.rhkb.cn/news/460230.html

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

相关文章

Python第六次作业

01.求第n项的斐波那契数列值 #求第n项的斐波那契数列值 #1、1、2、3、5、8、13、21、34…… #F(0)0&#xff0c;F(1)1, F(n)F(n - 1)F(n - 2)&#xff08;n ≥ 2&#xff0c;n ∈ N*&#xff09;def shulie ():print("求第n项的斐波那契数列值:",end"")xev…

Vue3 学习笔记(十三)Vue组件详解

1、组件&#xff08;Component&#xff09; 介绍 组件&#xff08;Component&#xff09;是 Vue.js 最强大的功能之一。 组件可以扩展 HTML 元素&#xff0c;封装可重用的代码&#xff0c;可以帮助你将用户界面拆分成独立和可复用的部分。 每个 Vue 组件都是一个独立的 Vue 实…

MySQL基础(二)

目录 一. 数据库命令行基本操作指令 1. 查看当前有哪些数据库——show databases; 2. 创建数据库——create database 数据库名 charset utf8 3. 选中数据库——use 数据库名; 4. 删除数据库——drop database 数据库名; 二. 常用数据类型 2.1 数值类型 2.2. 字符串类型 …

详细解读 CVPR2024:VideoBooth: Diffusion-based Video Generation with Image Prompts

Diffusion Models专栏文章汇总:入门与实战 前言:今天是程序员节,先祝大家节日快乐!文本驱动的视频生成正在迅速取得进展。然而,仅仅使用文本提示并不足以准确反映用户意图,特别是对于定制内容的创建。个性化图片领域已经非常成功了,但是在视频个性化领域才刚刚起步,这篇…

深度学习案例:带有一个隐藏层的平面数据分类

该案例来自吴恩达深度学习系列课程一《神经网络和深度学习》第三周编程作业&#xff0c;作业内容是设计带有一个隐藏层的平面数据分类。作业提供的资料包括测试实例&#xff08;testCases.py&#xff09;和任务功能包&#xff08;planar_utils.py&#xff09;&#xff0c;下载请…

SD教程 重绘 ControlNet-Inpain

SD教程 重绘 ControlNet-Inpain ———————————————— 版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。原文链接&#xff1a;https://blog.csdn.net/A1353192296/article/details/13…

【界面改版】JimuReport 积木报表 v1.9.0 版本发布,填报能力和大屏能力

项目介绍 积木报表JimuReport&#xff0c;是一款免费的数据可视化报表&#xff0c;含报表、仪表盘和大屏设计&#xff0c;像搭建积木一样完全在线设计&#xff01;功能涵盖&#xff1a;数据报表、打印设计、图表报表、门户设计、大屏设计等&#xff01; Web版报表设计器&#x…

【网络】1.UDP通信

UDP通信 1 server1.1 server建立的步骤1.2 运行server 2 client2.1 client的建立步骤2.2 运行client 3 总结3.1 server3.2 client 1 server server的启动方式是&#xff1a;./udpserver 8080 --> 格式就是./proc port端口 port端口自己指定 1.1 server建立的步骤 获取文件描…

告别冰冷机器声:GLM-4-Voice开启情感语音交互新时代!

目录 引言一、GLM-4-Voice概述二、GLM-4-Voice的架构三、GLM-4-Voice的主要功能四、GLM-4-Voice的技术原理五、GLM-4-Voice的应用场景六、GLM-4-Voice体验快速开始结语 引言 在人工智能的不断进步中&#xff0c;语音交互技术正逐渐成为人机沟通的重要桥梁。它不仅极大地提升了…

MySQL定时异机备份

场景&#xff1a;将A机器MySQL数据库部分表每日定时备份到B机器上 &#xff08;只适用于Linux&#xff09; 实现方式算是比简单了&#xff0c;就是用mysqldump生成文件&#xff0c;使用scp命令传输到另一台机器上。 1. 编写备份shell脚本 在A机器新建脚本 (当然没有vim的话vi…

使用VS2019将C#代码生成DLL文件在Unity3D里面使用(一)

系列文章目录 untiy知识点 文章目录 系列文章目录&#x1f449;前言&#x1f449;一、首先你要先有VS&#x1f449;二、引用UnityAPI使用步骤&#x1f449;2-1.引用unitydll文件到项目里面&#x1f449;2-2.导入Dll文件 &#x1f449;三、编辑dll代码&#x1f449;四、导出dll…

平台化运营公司如何在创业市场招商

在当今商业环境中&#xff0c;平台化运营的公司正成为推动经济发展的重要力量。对于这类公司而言&#xff0c;在创业市场招商意义重大。 平台化运营公司具有独特特点&#xff1a;通过搭建开放共享平台连接供需双方&#xff0c;实现资源优化配置与价值创造。比如电子商务平台、社…

聚类分析算法——K-means聚类 详解

K-means 聚类是一种常用的基于距离的聚类算法&#xff0c;旨在将数据集划分为 个簇。算法的目标是最小化簇内的点到簇中心的距离总和。下面&#xff0c;我们将从 K-means 的底层原理、算法步骤、数学基础、距离度量方法、参数选择、优缺点 和 源代码实现 等角度进行详细解析。…

SpringMVC执行流程(视图阶段JSP、前后端分离阶段)、面试题

目录 1.SpringMVC执行流程分为以下两种 2.非前后端分离的SpringMVC的执行流程 3.前后端分离的项目SpringMVC执行流程 4. 面试题 1.SpringMVC执行流程分为以下两种 2.非前后端分离的SpringMVC的执行流程 流程图&#xff1a; 更加生动的描述&#xff1a; DisPatcherServlet…

十分钟Linux中的epoll机制

epoll机制 epoll是Linux内核提供的一种高效I/O事件通知机制&#xff0c;用于处理大量文件描述符的I/O操作。它适合高并发场景&#xff0c;如网络服务器、实时数据处理等&#xff0c;是select和poll的高效替代方案。 1. epoll的工作原理 epoll通过内核中的事件通知接口和文件…

GRE Over IPsec(华三)

GRE Over IPsec 顾名思义&#xff0c;GRE在内&#xff0c;IPsec在外 那么当数据进入tunnel隧道后&#xff0c;会先被GRE封装后再进行IPsec感兴趣流acl匹配&#xff0c;匹配上了则封装IPsec&#xff0c;没匹配上则丢包 实验&#xff1a; 需求&#xff1a;总部pc能够通过gre o…

echarts属性之xAxis

xAxis 直角坐标系 grid 中的 x 轴&#xff0c;一般情况下单个 grid 组件最多只能放上下两个 x 轴&#xff0c;多于两个 x 轴需要通过配置 offset 属性防止同个位置多个 x 轴的重叠。 所有属性 xAxis. id string 组件 ID。默认不指定。指定则可用于在 option 或者 API 中引…

盘点:2024年最新热门项目管理平台TOP11

一、项目管理平台的重要性 在当今竞争激烈的商业环境中&#xff0c;项目管理平台已成为企业提高效率和团队协作的关键工具。这主要是因为现代商业项目日益复杂&#xff0c;涉及多个部门、众多资源以及不断变化的需求。 首先&#xff0c;项目管理平台能够提高工作效率。例如&a…

PHP数据类型

几种常用的数据类型&#xff1a; String&#xff08;字符串&#xff09; Integer&#xff08;整型&#xff09; Float&#xff08;浮点型&#xff09; Boolean&#xff08;布尔型&#xff09; NULL&#xff08;空值&#xff09; Array&#xff08;数组&#xff09; Obje…

【大数据】Flink + Kafka 实现通用流式数据处理详解

目录 一、前言 二、流式数据处理场景介绍 2.1 流式数据处理概述 2.1.1 流式数据处理场景介绍 2.2 流式数据处理技术栈 2.2.1 数据采集 2.2.2 数据处理 2.2.3 数据存储 2.2.4 数据展示 2.3 流式数据处理场景面临的问题和挑战 三、通用的流式数据处理场景解决方案 3.1…