跟AI学习Rust

本文为学习rust过程中,向ai提问的内容汇总。配套图书为《Rust程序设计 第2版》 基础 迭代器 fuse Cow 在 Rust 中,Cow 是 “Clone on Write” 的缩写,它是一个智能指针类型,属于标准库的 std::borrow 模块。Cow 可以用来封装一个可能是借用(borrowed)也可能是拥有(owned)的值。Cow类型实际上是一个枚举类型,定义如下: enum Cow<'a, B> where B: 'a + ToOwned + ?Sized, { Borrowed(&'a B), Owned(<B as ToOwned>::Owned), } 其中 B 是被借用的类型,而 <B as ToOwned>::Owned 是该类型的拥有版本。一个具体类型必须实现 ToOwned trait,这样 Cow 才能根据需要clone被借用的数据产生一个拥有的副本。 实际用途: Cow 最大的优势在于它提供了一种方法来延迟昂贵的克隆操作,直到真正需要修改数据时才进行,这样可以提高性能。它经常被用于以下场景: 优化读多写少的情况:当数据通常只是被读取,但偶尔需要被修改时,Cow 可以避免不必要的克隆操作。 提供 API 的灵活性:某些函数可能需要对输入数据做出修改,但并不总是需要。这时,使用 Cow 作为参数类型允许调用者传递拥有的也可以是借用的值,增加了 API 的使用灵活性。 处理字符串数据:当处理字符串切片(&str)和字符串(String)时,Cow<str> 可以根据实际情况借用静态字符串或者拥有一个可变的字符串副本。 避免生命周期问题:当要返回一个引用但函数的实际行为可能需要返回一个拥有的值时,使用 Cow 可以更好地管理生命周期问题。 示例: 你可以在下面的示例中看到 Cow 的用法: use std::borrow::Cow; fn greeting(name: &str) -> Cow<str> { if name....

February 16, 2024 · 11 min · czyt

在 Rust 中使用 Axum【译】

本文原文地址为 https://www.shuttle.rs/blog/2023/12/06/using-axum-rust Rust Web 生态系统中有如此多的后端 Web 框架,很难知道该选择什么。尽管在更早的过去,您可能会看到 Rocket 在受欢迎程度方面跃居排行榜首位,但现在通常是 Axum 和 actix-web 展开激烈的竞争,Axum 慢慢地登上了榜首。在本文中,我们将深入研究 Axum,这是一个由 Tokio 团队支持的用于制作 Rust REST API 的 Web 框架,它易于使用,并且与 Tower 具有超兼容性,Tower 是一个强大的可重用、模块化组件库,用于构建网络应用程序。 在本文中,我们将全面了解如何使用 Axum 编写 Web 服务。这也将包括 0.7 的更改。 Axum的路由 Axum 遵循 REST 风格的 API(例如 Express)的风格,您可以在其中创建处理函数并将它们附加到 axum 的 axum::Router 类型。路线的示例可能如下所示: async fn hello_world() -> &'static str { "Hello world!" } 然后我们可以将它添加到我们的路由器中,如下所示: use axum::{Router, routing::get}; fn init_router() -> Router { Router::new() .route("/", get(hello_world)) } 为了使处理函数有效,它需要是 axum::response::Response 类型或实现 axum::response::IntoResponse 。这已经针对大多数原始类型和 Axum 自己的所有类型实现了 - 例如,如果我们想要将一些 JSON 数据发送回用户,我们可以使用 Axum 的 JSON 类型作为返回类型来轻松实现这一点, axum::Json 类型包装了我们想要发回的任何内容。正如您在上面看到的,我们还可以单独返回一个字符串(切片)。...

January 30, 2024 · 6 min · czyt

Rust宏示例和实践【译】

原文链接为 https://earthly.dev/blog/rust-macros/ ,文章大部分使用机器翻译,小部分进行了文字调整。 本文深入探讨 Rust 宏的强大功能和多功能性。 Earthly 保证构建过程与您创建的宏一样强大。了解更多关于地球的信息。 在 Rust 中,宏是使用通常称为元编程的技术生成其他 Rust 代码的代码片段。宏在编译期间被扩展,并且宏的输出被插入到程序的源代码中。 最著名的宏示例是 println! 。尽管它看起来像函数并且使用起来也像函数,但它实际上在编译过程中进行了扩展,并且 println! 调用被替换为更复杂的实现代码。 在本文中,您将看到一些宏的实际示例,并了解一些有关如何最好地使用它们的提示和技巧。 Rust 宏基础知识 本教程假设您熟悉 Rust 编程的基础知识。 在 Rust 中,有两种类型的宏:声明性宏和过程性宏。逐一查看: 声明性宏 声明性宏是最简单的宏类型,由 macro-rules! 宏定义。它们的外观和行为与 match 表达式类似。 match 表达式将表达式作为输入,并将其与一组预定义模式进行匹配并运行相应的代码。类似地,声明性宏将一段 Rust 源代码作为输入,将源代码与一组预定义的结构进行匹配,并且在成功匹配时,将代码替换为与匹配模式关联的代码。 以下示例显示了正在运行的声明性宏: declarative_macro.rs//declarative_macro.rs macro_rules! greetings { ($x: expr) => { println!("Hello, {}", $x); }; } fn main() { greetings!("Earthly"); // Prints "Hello, Earthly" } 这里,宏被命名为 greetings 并用 macro_rules! 定义。在宏主体中,只有一种模式: ($x: expr) => { ....

January 28, 2024 · 7 min · czyt

在 Rust 中使用 Serde【译】

本文原文链接为 https://www.shuttle.rs/blog/2024/01/23/using-serde-rust 。大部分使用机器翻译,个人对机器翻译内容进行了部分润色,对于部分内容进行了增补。 在本文中,我们将讨论 Serde、如何在 Rust 应用程序中使用它以及一些更高级的提示和技巧。 什么是serde? serde Rust create用于高效地序列化和反序列化多种格式的数据。它通过提供两个可以使用的trait来实现这一点,恰当地命名为 Deserialize 和 Serialize 。作为生态系统中最著名的 crate 之一,它目前支持 20 多种类型的序列化(反序列化)。 首先,您需要将 crate 安装到您的 Rust 应用程序中: cargo add serde 使用serde 反序列化和序列化数据 序列化和反序列化数据的简单方法是添加 serde derive 功能。这会添加一个宏,您可以使用它来自动实现 Deserialize 和 Serialize - 您可以使用 --features 标志( -F 来实现)短的): cargo add serde -F derive 然后我们可以将宏添加到我们想要实现 Deserialize 或 Serialize 的任何struct体或enum(枚举)中: use serde::{Deserialize, Serialize}; #[derive(Deserialize, Serialize)] struct MyStruct { message: String, // ... the rest of your fields } 这允许我们使用任何支持 serde 的包在所述格式之间进行转换。作为示例,让我们使用 serde-json 与 JSON 格式相互转换:...

January 25, 2024 · 6 min · czyt

转换数字到Excel列字母实现

根据微软官方文档,excel最大支持1,048,576 行, 16,384 列。下面的代码并未处理这一限制。 Rust 实现代码: fn convert_to_title(mut n: i32) -> String { let mut result = String::new(); while n != 0 { n -= 1; let letter = (n % 26) as u8 + b'A'; result.insert(0, letter as char); n /= 26; } result } #[test] fn test_convert_to_title() { let aa = convert_to_title(27); assert_eq!(aa, "AC"); } Go 实现代码: func convertToTitle(n int) string { result := "" for n > 0 { n-- letter := n%26 result = string('A'+letter) + result n /= 26 } return result } C# 实现代码:...

January 25, 2024 · 1 min · czyt

一些Rust的学习资料

在线教程 concurrency programming via rust https://blog.fudenglong.site/Programming-Rust/ jetbrains出品的rust教程 Rust Book experiment 微软出品:写给.net开发人员的Rust教程 Google Android团队写的Rust教程 通过例子学rust https://cheats.rs/ Rust语言圣经 learn how to write macros in Rust Operating System development tutorials in Rust on the Raspberry Pi Rust语言实战 inside rust std library A Plugin System in Rust https://learning-rust.github.io https://github.com/CleanCut/ultimate_rust_crash_course Writing a JVM in Rust Rust 宏小册 Writing an OS in Rust 清华大学程序设计训练(Rust) Rust 异步编程指南 rust ffi guide Rust基础教程 rCore-Tutorial-Book 第三版 OffensiveRust RustPrimer Rust Atomics and Locks中文版 Rust 程序设计语言 2021版 中文 The Rust on ESP Book中文版 rust 教程资料收集 - fkysly case studies Y分钟速成X=Rust Rust 101 Rust Design Patterns 中文版 / pdf gRPC相关 https://blog....

March 28, 2023 · 1 min · czyt

Rust安装及配置

下载rustup 从此处下载,如果你需要安装vs的cpp生成工具,可以在这个页面进行下载。 设置rustup镜像 字节提供的镜像 https://rsproxy.cn export RUSTUP_DIST_SERVER="https://rsproxy.cn" export RUSTUP_UPDATE_ROOT="https://rsproxy.cn/rustup" 设置两个环境变量即可 设置环境变量 RUSTUP_DIST_SERVER (用于更新 toolchain) export RUSTUP_DIST_SERVER=https://mirrors.ustc.edu.cn/rust-static 以及 RUSTUP_UPDATE_ROOT (用于更新 rustup) export RUSTUP_UPDATE_ROOT=https://mirrors.ustc.edu.cn/rust-static/rustup 设置RUSTUP_HOME和CARGO_HOME可以实现自定义安装路径 crates.io 镜像 编辑 ~/.cargo/config ,这里使用的是中科大的镜像。 [source.crates-io] replace-with = 'ustc' [source.ustc] registry = "git://mirrors.ustc.edu.cn/crates.io-index" 或者使用字节的,参考官网文档 [source.crates-io] replace-with = 'rsproxy-sparse' [source.rsproxy] registry = "https://rsproxy.cn/crates.io-index" [source.rsproxy-sparse] registry = "sparse+https://rsproxy.cn/index/" [registries.rsproxy] index = "https://rsproxy.cn/crates.io-index" [net] git-fetch-with-cli = true 安装Rust Windows 安装rust即可。可以参考我的步骤,如果安装的是vs的cpp build tools,可以跳过。 Current installation options: default host triple: x86_64-pc-windows-msvc default toolchain: stable (default) profile: default modify PATH variable: yes 1) Proceed with installation (default) 2) Customize installation 3) Cancel installation >2 I'm going to ask you the value of each of these installation options....

February 28, 2022 · 8 min · czyt