快速上手 Rust——实用示例

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

1.3 实用示例

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

1.3.1 文件操作示例

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

创建和写入文件

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

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),}
}
读取文件

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

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 依赖:

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

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

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 模块创建多个线程并处理数据。

创建线程

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

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 组合。以下示例演示了如何安全地共享和修改数据。

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 数据库的连接。

#[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"))
}
执行查询

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

#[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 创建一个新的项目。打开终端并运行以下命令:

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

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

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 库进行模式匹配。以下是一个使用正则表达式提取字符串中所有数字的示例。

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);
}
运行项目

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

cargo run

小结

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

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

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

相关文章

人工智能与数据安全:Facebook如何应对隐私挑战

在数字时代&#xff0c;数据隐私和安全成为了用户和企业关注的核心问题。作为全球最大的社交媒体平台之一&#xff0c;Facebook面临着日益严峻的隐私挑战。近年来&#xff0c;频繁发生的数据泄露事件和对用户隐私的质疑&#xff0c;使得Facebook在保护用户数据方面倍感压力。为…

2024年ABS分区更新,聚焦管理科学领域新动态

2024学术期刊指南简介 2024年10月30日&#xff0c;英国商学院协会&#xff08;Chartered Association of Business Schools&#xff09;发布了最新的《学术期刊指南&#xff08;Academic Journal Guide&#xff09;》&#xff08;以下简称“《指南》”&#xff09;&#xff0c…

解读!中国人工智能大模型技术白皮书!

近期&#xff0c;中国人工智能协会发布了《中国人工智能大模型技术白皮书》&#xff0c;系统梳理了大模型技术演进&#xff0c;深入探讨关键技术要素&#xff0c;并剖析当前挑战及未来展望。我为大家做了简要总结&#xff0c;并附上原文供深入阅读。 目录 第 1 章 大模型技术概…

深度学习笔记之BERT(一)BERT的基本认识

深度学习笔记之BERT——BERT的基本认识 引言回顾&#xff1a;Transformer的策略回顾&#xff1a;Word2vec的策略和局限性 BERT \text{BERT} BERT的基本理念抽象的双向BERT的预训练策略 预训练与微调 引言 从本节开始&#xff0c;将介绍 BERT \text{BERT} BERT系列模型以及其常…

二:Linux学习笔记(第一阶段)-- Linux命令

目录 Linux注意事项&#xff1a; Linux目录 Linux系统基础命令 1. 文件和目录操作 2. 文件查看和编辑 3. 文件权限和所有权 4. 系统信息 5. 网络命令 6. 文件查找 7. 压缩和解压缩 8. 系统管理 Linux注意事项&#xff1a; 严格区分大小写一切皆文件windows下的程序不…

基于 Java 语言双代号网络图自动绘制系统

基于Java语言双代号网络图自动绘制系统研究与实现 一、摘要 网络计划技术已被广泛应用于工业、农业、国防、科学研究等多个领域中的项目计划与管理&#xff0c;以缩短项目周期&#xff0c;提高资源的利用效率。在网络计划技术中&#xff0c;绘制网络图是网络计划技术的基础工…

多模态大模型微调实践!PAI+LLaMA Factory搭建AI导游

一、引言 AI的快速发展推动了各行各业的智能化转型和创新&#xff0c;随之而来的是对AI应用的迫切需求。 如何微调大模型、高效搭建AI应用成为了开发者们广泛关注的技术方向。阿里云人工智能平台PAI&#xff0c;联合开源低代码大模型微调框架LLaMA Factory &#xff0c;共同打…

设计模式-单例模型(单件模式、Singleton)

单例模式是一种创建型设计模式&#xff0c; 让你能够保证一个类只有一个实例&#xff0c; 并提供一个访问该实例的全局节点。 单例模式同时解决了两个问题&#xff0c; 所以违反了单一职责原则&#xff1a; 保证一个类只有一个实例。 为什么会有人想要控制一个类所拥有的实例…

基于SSM+微信小程序的社团登录管理系统(社团1)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 2、项目技术 3、开发环境 4、功能介绍 1、项目介绍 基于SSM微信小程序的社团登录管理系统实现了管理员及社团、用户。 1、管理员实现了首页、用户管理、社团管理、社团信息管理、社…

DAYWEB69 攻防-Java 安全JWT 攻防Swagger 自动化算法签名密匙Druid 泄漏

知识点 1、Java安全-Druid监控-未授权访问&信息泄漏 2、Java安全-Swagger接口-文档导入&联动批量测试 2、Java安全-JWT令牌攻防-空算法&未签名&密匙提取 Java安全-Druid监控-未授权访问&信息泄漏 Druid是阿里巴巴数据库事业部出品&#xff0c;为监控而…

SMO算法 公式推导

min ⁡ α 1 2 ∑ i 1 N ∑ j 1 N α i α j y i y j K ( x i ⋅ x j ) − ∑ i 1 N α i s.t. ∑ i 1 N α i y i 0 0 ≤ α i ≤ C , i 1 , 2 , ⋯ , N (9-69) \begin{aligned} & \min_{\alpha} \quad \frac{1}{2} \sum_{i1}^{N} \sum_{j1}^{N} \alpha_i \alpha_j…

OpenCV系列教程六:信用卡数字识别、人脸检测、车牌/答题卡识别、OCR

文章目录 一、信用卡数字识别1.1 模板匹配1.2 匹配多个对象1.3 处理数字模板1.4 预处理卡片信息&#xff0c;得到4组数字块。1.5 遍历数字块&#xff0c;将卡片中每个数字与模板数字进行匹配 二、人脸检测2.1人脸检测算法原理2.2 OpenCV中的人脸检测流程 三、车牌识别3.1 安装t…

2024年10月总结及随笔之漏更及失而复得

1. 回头看 日更坚持了670天。 读《数据湖仓》更新完成读《数据工程之道&#xff1a;设计和构建健壮的数据系统》开更并持续更新 2023年至2024年10月底累计码字1642797字&#xff0c;累计日均码字2451字。 2024年10月码字86801字&#xff0c;同比下降30.77%&#xff0c;环比…

VScode + PlatformIO 了解

​Visual Studio Code Visual Studio Code&#xff08;简称 VS Code&#xff09;是一款由微软开发且跨平台的免费源代码编辑器。该软件以扩展的方式支持语法高亮、代码自动补全&#xff08;又称 IntelliSense&#xff09;、代码重构功能&#xff0c;并且内置了工具和 Git 版本…

一二三应用开发平台自定义查询设计与实现系列2——查询方案功能实现

查询方案功能实现 上面实现了自定义查询功能框架&#xff0c;从用户角度出发&#xff0c;有些条件组合可以形成特定的查询方案&#xff0c;对应着业务查询场景。诸多查询条件的组合&#xff0c;不能每次都让用户来设置&#xff0c;而是应该保存下来&#xff0c;下次可以直接使…

WebSocket 连接频繁断开的问题及解决方案

文章目录 WebSocket 连接频繁断开的问题及解决方案1. 引言2. 什么是 WebSocket&#xff1f;2.1 WebSocket 的优势2.2 WebSocket 的工作原理 3. WebSocket 连接频繁断开的常见原因3.1 服务器端问题3.1.1 服务器负载过高3.1.2 服务器配置不当3.1.3 超时设置 3.2 网络问题3.2.1 网…

萤石私有化设备视频平台EasyCVR视频融合平台如何构建农业综合监控监管系统?

现代农业的迅速发展中&#xff0c;集成监控管理系统已成为提高农业生产效率和优化管理的关键工具。萤石私有化设备视频平台EasyCVR&#xff0c;作为一个具有高度可扩展性、灵活的视频处理能力和便捷的部署方式的视频监控解决方案&#xff0c;为农业监控系统的建设提供了坚实的技…

#渗透测试#SRC漏洞挖掘# 信息收集-Shodan之搜索语法进阶

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

Fsm3

采用读热码编写方式&#xff1a; module top_module(input clk,input in,input areset,output out); ////reg [3:0]A 4d0001;// reg [3:0]B 4d0010;//reg [3:0]C 4d0100;// reg [3:0]D 4d1000; //1、首先用读热码定义四个状态变量parameter A 4d0001 ,B 4d0010, C 4d01…

62-Java-面试专题(1)__基础

62-Java-面试专题(1)__基础-- 笔记 笔记内容来源与黑马程序员教学视频 文章目录 62-Java-面试专题(1)__基础-- 笔记Java-面试专题(1)笔记中涉及资源&#xff1a; 一、二分查找①&#xff1a;代码实现1. 流程2. 代码实现3. 测试 ②&#xff1a;解决整数溢出&#xff08;方法一&…