快速上手 Rust——实用示例

news/2024/10/31 4:33:33/

Rust 跨平台应用开发第一章:快速上手 Rust——实用示例

1.3 实用示例

在这一节中,我们将通过一系列实用的示例来帮助您更好地理解 Rust 的特性,并展示如何在实际项目中使用这些特性。示例将涵盖文件操作、网络请求、并发编程、命令行工具以及使用 Cargo 管理依赖等多个方面。

1.3.1 文件操作示例

Rust 提供了强大的标准库来进行文件操作。在这个示例中,我们将实现一个简单的文本文件读写程序。

创建和写入文件

我们将使用 std::fs 模块中的 FileWrite trait 来创建和写入文件。

rust">use std::fs::File;
use std::io::{self, Write};fn write_to_file(filename: &str, content: &str) -> io::Result<()> {let mut file = File::create(filename)?;file.write_all(content.as_bytes())?;Ok(())
}fn main() {match write_to_file("output.txt", "Hello, Rust!") {Ok(_) => println!("File written successfully."),Err(e) => println!("Failed to write to file: {}", e),}
}
读取文件

接下来,我们将读取文件的内容并打印到控制台。

rust">use std::fs::read_to_string;fn read_from_file(filename: &str) -> io::Result<String> {let content = read_to_string(filename)?;Ok(content)
}fn main() {match read_from_file("output.txt") {Ok(content) => println!("File content:\n{}", content),Err(e) => println!("Failed to read file: {}", e),}
}

1.3.2 网络请求示例

Rust 的 reqwest 库使得发起 HTTP 请求变得非常简单。以下示例将演示如何发送 GET 请求并处理响应。

使用 reqwest

首先,确保在 Cargo.toml 中添加 reqwest 依赖:

rust">[dependencies]
reqwest = { version = "0.11", features = ["blocking"] }
tokio = { version = "1", features = ["full"] }
发送 GET 请求

下面的代码示例演示了如何发送 GET 请求并处理 JSON 响应。

rust">use reqwest::blocking::get;
use reqwest::Error;
use serde::Deserialize;#[derive(Deserialize)]
struct ApiResponse {userId: u32,id: u32,title: String,completed: bool,
}fn fetch_data(url: &str) -> Result<ApiResponse, Error> {let response = get(url)?.json()?;Ok(response)
}fn main() {let url = "https://jsonplaceholder.typicode.com/todos/1";match fetch_data(url) {Ok(data) => println!("Fetched data: {:?}", data),Err(e) => println!("Error fetching data: {}", e),}
}

1.3.3 并发编程示例

Rust 提供了内置的支持用于并发编程。在这个示例中,我们将使用 std::thread 模块创建多个线程并处理数据。

创建线程

下面的代码示例演示了如何创建多个线程,并在每个线程中执行计算任务。

rust">use std::thread;fn main() {let mut handles = vec![];for i in 0..5 {let handle = thread::spawn(move || {println!("Thread {} is running", i);// 模拟计算i * i});handles.push(handle);}for handle in handles {match handle.join() {Ok(result) => println!("Thread result: {}", result),Err(e) => println!("Thread error: {:?}", e),}}
}
使用 ArcMutex

为了在多个线程间共享数据,我们可以使用 ArcMutex 组合。以下示例演示了如何安全地共享和修改数据。

rust">use std::sync::{Arc, Mutex};
use std::thread;fn main() {let counter = Arc::new(Mutex::new(0));let mut handles = vec![];for _ in 0..10 {let counter = Arc::clone(&counter);let handle = thread::spawn(move || {let mut num = counter.lock().unwrap();*num += 1;});handles.push(handle);}for handle in handles {handle.join().unwrap();}println!("Final count: {}", *counter.lock().unwrap());
}

1.3.4 数据库操作示例

Rust 也支持与数据库的交互。在这个示例中,我们将使用 diesel 库进行数据库操作。

设置 diesel

确保在 Cargo.toml 中添加 diesel 依赖:

[dependencies]
diesel = { version = "1.4", features = ["sqlite"] }
创建数据库连接

以下代码示例演示如何建立与 SQLite 数据库的连接。

rust">#[macro_use]
extern crate diesel;use diesel::prelude::*;
use diesel::sqlite::SqliteConnection;fn establish_connection() -> SqliteConnection {SqliteConnection::establish("my_database.db").expect(&format!("Error connecting to {}", "my_database.db"))
}
执行查询

以下示例演示了如何执行简单的查询,并处理结果。

rust">#[derive(Queryable)]
struct User {id: i32,name: String,
}fn get_users(connection: &SqliteConnection) -> Vec<User> {use diesel::dsl::insert_into;use diesel::table;let results = table::users::table.load::<User>(connection).expect("Error loading users");results
}fn main() {let connection = establish_connection();let users = get_users(&connection);for user in users {println!("User {}: {}", user.id, user.name);}
}

1.3.5 编写一个简单的命令行工具

Rust 是编写命令行工具的理想选择,因其性能和简洁性。以下示例将展示如何编写一个简单的命令行工具,该工具能够接收用户输入并执行基本的文本操作。

创建新项目

首先,我们需要使用 Cargo 创建一个新的项目。打开终端并运行以下命令:

rust">cargo new cli_tool
cd cli_tool
编写命令行工具代码

我们将在 src/main.rs 中编写代码,使其能够接收用户输入并输出处理后的结果。以下是一个简单的命令行工具,它接受用户输入的字符串并返回字符串的长度和反转结果。

rust">use std::io;fn main() {println!("请输入一个字符串:");let mut input = String::new();io::stdin().read_line(&mut input).expect("读取输入失败");let trimmed_input = input.trim();let length = trimmed_input.len();let reversed: String = trimmed_input.chars().rev().collect();println!("您输入的字符串长度为:{}", length);println!("反转后的字符串为:{}", reversed);
}
运行命令行工具

在终端中运行以下命令,启动我们的命令行工具:

cargo run

输入一个字符串,您将看到工具返回该字符串的长度和反转结果。


1.3.6 使用 Cargo 管理依赖

Cargo 是 Rust 的构建系统和包管理器,能够轻松管理项目依赖。以下示例将展示如何在项目中添加和使用外部库。

添加依赖

假设我们想使用 regex 库来处理正则表达式。在 Cargo.toml 中,添加如下依赖:

[dependencies]
regex = "1"
使用外部库

src/main.rs 中,我们将使用 regex 库进行模式匹配。以下是一个使用正则表达式提取字符串中所有数字的示例。

rust">use regex::Regex;
use std::io;fn main() {println!("请输入一个字符串:");let mut input = String::new();io::stdin().read_line(&mut input).expect("读取输入失败");let re = Regex::new(r"\d+").unwrap();let numbers: Vec<&str> = re.find_iter(&input).map(|mat| mat.as_str()).collect();println!("输入字符串中的数字有:{:?}", numbers);
}
运行项目

再次使用以下命令运行项目,您将能够输入一个字符串,并看到其中提取出的所有数字。

rust">cargo run

小结

在本节中,我们通过一系列实用示例展示了 Rust 在文件操作、网络请求、并发编程、命令行工具以及数据库操作等方面的应用。这些示例不仅展示了 Rust 的强大功能,还提供了实际开发中的指导和参考。通过这些示例,您可以更好地理解 Rust 的特性,并将其应用于您的项目中。


http://www.ppmy.cn/news/1543270.html

相关文章

python基础补充

1.python包和模块 当使用Python编程时&#xff0c;包&#xff08;Packages&#xff09;和模块&#xff08;Modules&#xff09;是两个关键的概念&#xff0c;它们有助于组织、管理和复用代码。 1.模块 一个.py 文件就是一个模块 模块是含有一系列数据&#xff0c;函数&…

扫雷游戏(C语言详解)

扫雷游戏&#xff08;C语言详解&#xff09; 放在最前面的1、前言&#xff08;扫雷游戏的简介&#xff09;2、扫雷游戏的规则&#xff08;简易版&#xff09;3、代码实现&#xff08;3.1&#xff09;提醒一下&#xff1a;( i ) 提醒1&#xff1a;( ii ) 提醒2&#xff1a; &…

德州百佳妇婴医院 实力强劲 良心、温馨、放心之选

在德州&#xff0c;提起德州百佳妇婴医院&#xff0c;许多人都会竖起大拇指。这家医院以其强劲的实力、良心的服务、温馨的环境和让人放心的医疗品质&#xff0c;成为众多家庭的信赖之选。 德州百佳妇婴医院拥有雄厚的实力。医院汇聚了一批医术精湛、经验丰富的医疗专家团队。…

java-web-day6

1.请求参数: 1.简单参数 参数名和形参变量名一致 不一致, 可以通过RequestParam进行映射 2.实体参数 3.数组集合参数 集合使用RequestParam注解, 因为接受默认是数组格式 4.日期参数 使用LocalDateTime接受, 需要使用DateTimeFormat(pattern "yyyy-MM-dd HH:mm:ss")…

论文笔记:SIBO: A Simple Booster for Parameter-Efficient Fine-Tuning

ACL 2024 1 intro 基于 Transformer 的大模型一般都有很多层 在广泛采用的 PEFT 技术&#xff08;包括 Adapters 和 LoRA&#xff09;中&#xff0c;尤其是在深层中&#xff0c;也存在过度平滑现象&#xff08;即token之间的相似度很高&#xff09;论文评估了同一语句中 toke…

24年追觅科技入职北森测评笔试:商业推理40分钟28题真题汇总、网盘资料、资源下载

在追觅科技的北森测评中&#xff0c;考生将面临一场时间紧迫、题目密集的挑战。本文旨在为即将参加北森测评的考生提供一份详尽的备考指南&#xff0c;以确保在40分钟内完成28道题目的高效答题。 考试概览 北森商业综合推理测评是评估考生综合能力的重要工具&#xff0c;它主…

10.29

2.3 队列 队列(Queue)&#xff0c;它是一种运算受限的线性表,先进先出(FIFO First In First Out) 队列是一种受限的线性结构 受限之处在于它只允许在表的前端&#xff08;front&#xff09;进行删除操作&#xff0c;而在表的后端&#xff08;rear&#xff09;进行插入操作 P…

【Python各个击破】numpy

简介 NumPy是一个开源的Python库,它提供了一个强大的N维数组对象和许多用于操作这些数组的函数。它是大多数Python科学计算的基础,包括Pandas、SciPy和scikit-learn等库都建立在NumPy之上。 安装 !pip install numpy导入 import numpy as np用法 # 创建1*6矩阵 a = np.a…