当前位置: 首页 > news >正文

100 Exercises To Learn Rust 挑战!准备篇

公司内部的学习会非常活跃!我也参与了Rust学习会,并且一直在研究rustlings。最近,我发现了一个类似于rustlings的新教程网站:Welcome - 100 Exercises To Learn Rust。

rustlings是基于Rust的权威官方文档《The Rust Programming Language》(简称TRPL)制作的,而100-exercises则在特性和异步处理等方面深入探讨,比TRPL更具挑战性,真的很值得一试!

接下来的一段时间,我会挑战“100 Exercises To Learn Rust”,并将这个过程记录下来写成文章。那么,让我们开始今天的准备篇吧!

环境搭建

这次我选择在 Ubuntu 24.10 上进行挑战!安装方法可以在官方网站上查看。

https://www.rust-lang.org/zh-CN/tools/install

不过,这其实一点也不难。Rust的安装非常简单,只需一行命令就可以完成,而且不需要管理员权限! 

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
info: downloading installerWelcome to Rust!~~ 省略 ~~Current installation options:default host triple: x86_64-unknown-linux-gnudefault toolchain: stable (default)profile: defaultmodify PATH variable: yes1) Proceed with standard installation (default - just press enter)
2) Customize installation
3) Cancel installation
>

在这里选择1。

1) Proceed with standard installation (default - just press enter)
2) Customize installation
3) Cancel installation
>1~~ 省略 ~~stable-x86_64-unknown-linux-gnu installed - rustc 1.78.0 (9b00956e5 2024-04-29)Rust is installed now. Great!To get started you may need to restart your current shell.
This would reload your PATH environment variable to include
Cargo's bin directory ($HOME/.cargo/bin).To configure your current shell, you need to source
the corresponding env file under $HOME/.cargo.This is usually done by running one of the following (note the leading DOT):
. "$HOME/.cargo/env"            # For sh/bash/zsh/ash/dash/pdksh
source "$HOME/.cargo/env.fish"  # For fish

如果你想在当前终端直接使用 cargo 命令等,需要加载 ~/.cargo/env 文件。顺便也可以检查一下版本。

. "$HOME/.cargo/env"
cargo --version

输出内容 

cargo 1.78.0 (54d8815d0 2024-03-26)

据说本月即将发布的1.80版本会有很多有趣的功能,比如cargo-script等。不过,现在我们还是以1.78.0版本为前提来进行接下来的学习吧!

虽然到这里看似准备工作已经完成了……但在Rust的编译过程中,我们还需要用到像gcc等C语言的编译环境。如果你是从一个全新安装的Ubuntu系统开始的话,可能会遇到如下错误。

$ cargo runCompiling project v0.1.0 (/path/to/project)
error: linker `cc` not found|= note: No such file or directory (os error 2)error: could not compile `project` (bin "project") due to 1 previous error

通过使用 apt 安装 build-essential 软件包,就可以安装gcc等必要的工具,这样就能顺利进行编译了。

sudo apt update
sudo apt install build-essential

另外,在使用 reqwest这个crate时,还需要安装 libssl-dev 等库。在进行Rust编程时,可能还会有其他需要提前安装的包,不过我们可以在练习过程中遇到需要时再逐一安装。

100 Exercises 导入

接下来,我们将引入 100-exercises-to-learn-rust。这个项目是通过 git 克隆的方式获取的。

git clone https://github.com/mainmatter/100-exercises-to-learn-rust.git
cd 100-exercises-to-learn-rust
git checkout -b my-solutions

这样一来,main分支的内容就会下载到本地。为了方便进度管理,我建议你在my-solutions分支上进行管理,我也是这么做的。所有练习题都在exercises目录下。

此外,据说solutions分支上有参考答案,如果在某些地方遇到困难,可以随时查看该分支的内容。

Workshop Runner 的安装

就像rustlings有专用的检查工具一样,100 Exercises 也有用于检查的工具。你可以通过 cargo install 命令来安装这个工具。

cargo install --locked workshop-runner
wr --help

输出内容

$ wr --help
A CLI to run test-driven Rust workshopsUsage: wr [OPTIONS] [COMMAND]Commands:open  Open a specific exercisehelp  Print this message or the help of the given subcommand(s)Options:--no-skip     ...--verbose     ...--keep-going  ...-h, --help        Print help-V, --version     Print version

这个工具似乎可以帮助你管理进度,解答完问题后可以使用它来更新进度。

编辑器选择

业界默认的标准组合是VSCode + rust-analyzer,因此我也会采用这个组合。rust-analyzer在安装后无需进行特别的配置,所以这里就不详细介绍了。

另外一个选择是最近正式发布的付费编辑器RustRover,感觉也不错。其实我对它很感兴趣

尝试挑战 第一题[01_intro/00_welcome]

到这里,环境已经顺利搭建完成,现在终于可以开始解题了。输入 wr 命令并选择“y”,即可进入第一道题目。

$ wrRunning tests...Eternity lies ahead of us, and behind. Your path is not yet finished. 🍂Do you want to open the next exercise, (01) intro - (00) welcome? [y/n] yAhead of you lies (01) intro - (00) welcomeOpen "exercises/01_intro/00_welcome" in your editor and get started!Run `wr` again to compile the exercise and execute its tests.

打开 exercises/01_intro/00_welcome/src/lib.rs 文件,你会看到一些注释,其中提到以下内容:

  • // 表示单行注释。
  • TODOtodo!(),以及 __,用于强调你需要在练习中完成的部分。
  • 代码的检查直接使用了Rust的标准测试机制(可以通过 cargo test 命令进行验证)。不过,wr 命令也可以替代这一过程。
  • 请不要修改测试内容。

那么,让我们赶紧解决第一个问题,然后继续前进吧!

fn greeting() -> &'static str {// TODO: fix me 👇"I'm ready to __!"
}#[cfg(test)]
mod tests {use crate::greeting;#[test]fn test_welcome() {assert_eq!(greeting(), "I'm ready to learn Rust!");}
}

带注释的版本

// This is a Rust file. It is a plain text file with a `.rs` extension.
//
// Like most modern programming languages, Rust supports comments. You're looking at one right now!
// Comments are ignored by the compiler; you can leverage them to annotate code with notes and
// explanations.
// There are various ways to write comments in Rust, each with its own purpose.
// For now we'll stick to the most common one: the line comment.
// Everything from `//` to the end of the line is considered a comment.// Exercises will include `TODO`, `todo!()` or `__` markers to draw your attention to the lines
// where you need to write code.
// You'll need to replace these markers with your own code to complete the exercise.
// Sometimes it'll be enough to write a single line of code, other times you'll have to write
// longer sections.
//
// If you get stuck for more than 10 minutes on an exercise, grab a trainer! We're here to help!
// You can also find solutions to all exercises in the `solutions` git branch.
fn greeting() -> &'static str {// TODO: fix me 👇"I'm ready to __!"
}// Your solutions will be automatically verified by a set of tests.
// You can run these tests directly by invoking the `cargo test` command in your terminal,
// from the root of this exercise's directory. That's what the `wr` command does for you
// under the hood.
//
// Rust lets you write tests alongside your code.
// The `#[cfg(test)]` attribute tells the compiler to only compile the code below when
// running tests (i.e. when you run `cargo test`).
// You'll learn more about attributes and testing later in the course.
// For now, just know that you need to look for the `#[cfg(test)]` attribute to find the tests
// that will be verifying the correctness of your solutions!
//
// ⚠️ **DO NOT MODIFY THE TESTS** ⚠️
// They are there to help you validate your solutions. You should only change the code that's being
// tested, not the tests themselves.
#[cfg(test)]
mod tests {use crate::greeting;#[test]fn test_welcome() {assert_eq!(greeting(), "I'm ready to learn Rust!");}
}

只要修改代码使测试通过,你就成功完成这一题了。

解说

这一题很简单,只需要将指定的字符串按照提示修改即可!

fn greeting() -> &'static str {// TODO: fix me 👇-    "I'm ready to __!"+    "I'm ready to learn Rust!"}

这里稍微解释一下:assert_eq! 是一个类似于函数的宏,它接受两个参数,并判断这两个参数是否相等。

由于这是“字符串的比较”,对于习惯其他编程语言的人来说,可能会对这个过程有所警惕,但不用担心。大概在后面的章节中会提到,Rust 中的 == 比较实际上是通过 eq 方法来实现的,对于字符串比较,它会从头开始逐字符进行比较,确保所有字符都相等。不会出现像检查指针是否相等这种直觉上不符合预期的比较方式。

解决问题后,你可以再次在项目根目录下运行 wr 命令,确认修改是正确的。

$ wrRunning tests...🚀 (01) intro - (00) welcomeEternity lies ahead of us, and behind. Your path is not yet finished. 🍂Do you want to open the next exercise, (01) intro - (01) syntax? [y/n] yAhead of you lies (01) intro - (01) syntaxOpen "exercises/01_intro/01_syntax" in your editor and get started!Run `wr` again to compile the exercise and execute its tests.

看起来一切都顺利!那我们继续挑战下一个问题吧!

下一篇文章: 【1】 语法、整数、变量

相关文章:

100 Exercises To Learn Rust 挑战!准备篇

公司内部的学习会非常活跃!我也参与了Rust学习会,并且一直在研究rustlings。最近,我发现了一个类似于rustlings的新教程网站:Welcome - 100 Exercises To Learn Rust。 rustlings是基于Rust的权威官方文档《The Rust Programming…...

瑞_RabbitMQ_初识MQ

文章目录 1 初识MQ1.1 同步调用1.1.1 同步调用的优势1.1.2 同步调用的缺点 1.2 异步调用1.2.1 异步调用的角色1.2.2 异步调用的优势1.2.3 异步调用的缺点1.2.4 异步调用的场景 1.3 MQ技术选型 2 RabbitMQ2.1 安装2.1.1 资源准备2.1.2 安装步骤 2.2 RabbitMQ架构2.3 RabbitMQ管理…...

系统内存管理:虚拟内存、内存分段与分页、页表缓存TLB以及Linux内存管理

虚拟内存 虚拟内存是一种操作系统提供的机制,用于将每个进程分配的独立的虚拟地址空间映射到实际的物理内存地址空间上。通过使用虚拟内存,操作系统可以有效地解决多个应用程序直接操作物理内存可能引发的冲突问题。 在使用虚拟内存的情况下&#xff0…...

Java每日一练_模拟面试题5(堆和栈的区别)

在Java中,堆(Heap)和栈(Stack)是两个不同的内存区域,它们在存储内容、管理方式、空间大小、分配方式等多个方面存在显著的区别。以下是Java中堆和栈的主要区别: 1. 存储内容不同 堆&#xff1…...

传感器校正和测试

是 一。舵机在使用过程中为了防止手动扭动损坏其中的齿轮&#xff0c;一般会使用代码测试并校正到0位。 #include <Servo.h> Servo myservo; // 创建一个Servo对象 // 连接到舵机信号线的Arduino引脚 int servoPin 9; void setup() { myservo.attach(servoPin…...

Eclipse 悬浮提示:提高编程效率的利器

Eclipse 悬浮提示&#xff1a;提高编程效率的利器 引言 在当今的软件开发领域&#xff0c;Eclipse 是一款广受欢迎的集成开发环境&#xff08;IDE&#xff09;。它以其强大的功能和灵活性而著称&#xff0c;被全球的开发者用于各种编程语言和项目。Eclipse 的一个显著特点是其…...

Vault系列之:创建令牌

Vault系列之&#xff1a;创建令牌 一、Vault令牌二、令牌认证三、创建一个新的令牌四、使用令牌登陆五、 撤销令牌 一、Vault令牌 Vault令牌是Vault服务器提供的一种身份验证方式&#xff0c;用于授权和访问Vault中存储的资源。Vault令牌可以是客户端令牌或服务令牌。客户端令…...

如何在 Windows 10 环境下安装和配置 MySQL:初学者指南

如何在 Windows 10 环境下安装和配置 MySQL&#xff1a;初学者指南 MySQL 是一个流行的开源数据库管理系统&#xff0c;广泛应用于各种应用程序中。对于初学者来说&#xff0c;了解如何在 Windows 10 环境下安装和配置 MySQL 是一个重要的第一步。本篇博客将详细介绍如何完成这…...

Ubuntu 24.04上报:Error: could not connect to ollama app, is it running?的解决方法

说起来这个问题真实让人无语。按照我之前说过的方法&#xff1a;设置Ollama在局域网中访问的方法&#xff08;Ubuntu&#xff09;_ollama 局域网访问-CSDN博客 把Ollama的默认端口修改后&#xff0c;如果再运行&#xff1a; ollama ps 则会报下面的错&#xff1a; Error: c…...

字典树查重(到底要开多大的空间啊)

前言&#xff1a;烦死了&#xff0c;这个题目一看就是用字典树来做&#xff0c;但是空间不知道开多大&#xff0c;烦死了 后来发现其实tree的第一维空间直接开极端的情况就行&#xff0c;就好像这一题&#xff0c;最多有 1e4 个字符串&#xff0c;每个字符串最长为 50&#xff…...

财务会计与管理会计(二)

文章目录 多工作表销售数据汇总1、INDIRECT函数2、HLOOKUP函数 多表筛选分类求和1、SUMIF函数2、INDIRECT函数 两组数据比对详解VLOOKUP函数的应用 多工作表销售数据汇总 1、INDIRECT函数 INDIRECT(""&D$4&"!D4:M24") 1月!D4:M24 HLOOKUP($A$1,I…...

技术周总结 08.05-08.11周日

文章目录 一、08.06 周二1.1) 问题01 mac安装 scala:1. 使用 Homebrew2. 使用 SDKMAN!其他注意事项1. 确认 Scala 安装位置2. 设置 PATH 环境变量对于 zsh (macOS Catalina 及更高版本默认使用 zsh):对于 bash (如果您使用的是 bash shell): 3. 验证安装 二、08.09 周五2.1&…...

B树和B+树的插入、删除

1. B树 1.1 B树的定义 树也称树&#xff0c;它是一颗多路平衡查找树。我们描述一颗树时需要指定它的阶数&#xff0c;阶数表示了一个结点最多有多少个孩子结点&#xff0c;用字母表示阶数。当取时&#xff0c;就是我们常见的二叉搜索树。 一颗阶的树定义如下&#xff1a; 每…...

Axios网络请求总结

在实际项目开发中&#xff0c;前端页面所需要的数据往往需要从服务器端获取&#xff0c;这必然涉及与服务器的通信。Axios 是一个基于 promise 网络请求库&#xff0c;作用于node.js 和浏览器中。Axios 在浏览器端使用XMLHttpRequests发送网络请求&#xff0c;并能自动完成JSON…...

立仪科技光谱共焦应用之金属隔膜静态重复性测量

01&#xff5c;检测需求&#xff1a;金属隔膜重复性测量 02&#xff5c;检测方式 为了保证精度&#xff0c;首先先用千分尺进行测量&#xff0c;得出相应的厚度数据&#xff0c;在选择合适的侧头&#xff0c;根据结果&#xff0c;我们现在立仪科技H4UO控制器搭配D27A20侧头 03&…...

vue3实现video视频+弹幕评论

vue3实现视频加评论 之前写了一篇博客使用了弹幕插件http://t.csdnimg.cn/616mlvue3 使用弹幕插件&#xff0c;今天对这个页面进行了升级 变成了 vue3使用video 这个没有使用插件&#xff0c;昨天看了好多&#xff0c;没发现有用的插件&#xff0c;下载了几个都没办法使用就用…...

STM32-OTA升级

一、OTA&#xff08;Over-The-Air&#xff09; OTA&#xff08;Over-The-Air&#xff09;是一种通过无线通信方式&#xff0c;为设备分发新软件、配置甚至更新加密密钥的技术。它允许中心位置向所有用户发送更新&#xff0c;确保每个接收者都无法拒绝、破坏或改变这些更新&…...

一种JSON多态表示法

介绍 假设现在需要实现一种功能: 从某个远程的组件(消息队列或远程文件)拉取最后几条记录做一个展示. 需要支持如下的组件: Kafka RocketMQ OSS 假设还有很多, 这里不列了 … 显然, 每种组件需要的参数各不一样, 那么此时如何使用一个统一的结构来表达这些组件的参数呢?…...

C语言实现单链表

一、什么是单链表 1.链表就是一种在物理存储上各个节点非连续的&#xff0c;随机的&#xff0c;元素的逻辑顺序是通过链表中的指针链接的次序而实现的。 图示&#xff1a; 二、单链表中节点的定义 #include<stdio.h> #include<stdlib.h> #include<string.h>…...

循环神经网络三

一.介绍 在普通的神经网络中&#xff0c;信息的传递是单向的&#xff0c;这种限制虽然使得网络变得更容易学习&#xff0c;单在一定程度上也减弱了神经网络模型的能力。特别是在现实生活中&#xff0c;网络的输出不仅和当前时刻的输入相关&#xff0c;也过去一段时间的输出相关…...

OpenClaw技能市场巡礼:Top5适合Phi-3-vision-128k-instruct的图文处理插件

OpenClaw技能市场巡礼&#xff1a;Top5适合Phi-3-vision-128k-instruct的图文处理插件 1. 为什么需要为多模态模型搭配专用技能&#xff1f; 去年我在尝试用OpenClaw处理一批产品截图时&#xff0c;发现一个有趣现象&#xff1a;当我把图片直接丢给普通文本模型时&#xff0c…...

DLSS Swapper终极指南:三大智能矩阵,重新定义游戏性能优化

DLSS Swapper终极指南&#xff1a;三大智能矩阵&#xff0c;重新定义游戏性能优化 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 你是否曾为游戏卡顿而烦恼&#xff1f;当最新的3A大作在4K分辨率下帧率骤降&#xff0…...

大规模数据清洗效率提升300%的Polars 2.0实战方案(内存泄漏避坑全图谱)

第一章&#xff1a;Polars 2.0大规模数据清洗的范式跃迁 Polars 2.0 不再是 Pandas 的轻量替代品&#xff0c;而是一次面向现代硬件与真实数据工程场景的底层重构。其核心跃迁体现在三重解耦&#xff1a;计算图与执行引擎分离、内存布局与逻辑 Schema 解耦、以及 I/O 层与处理层…...

告别迷茫!Quartus II 13.1 从新建工程到烧录FPGA的保姆级避坑指南

Quartus II 13.1实战指南&#xff1a;从零开始玩转FPGA开发 第一次打开Quartus II 13.1时&#xff0c;那个灰蒙蒙的界面和密密麻麻的菜单栏确实容易让人望而生畏。作为Altera&#xff08;现已被Intel收购&#xff09;旗下经典的FPGA开发工具&#xff0c;它在高校实验室和企业研…...

别只埋头改Bug!从Flutter高德地图鸿蒙适配,聊聊跨平台插件架构设计的最佳实践

从Flutter高德地图鸿蒙适配看跨平台插件架构设计的黄金法则 当Flutter遇上鸿蒙&#xff0c;开发者们既兴奋又忐忑。兴奋的是跨平台开发框架与国产操作系统的强强联合&#xff0c;忐忑的是两者结合带来的技术适配挑战。去年我们团队在将高德地图SDK集成到Flutter鸿蒙应用时&…...

提升GitHub访问效率的实用方案

提升GitHub访问效率的实用方案 【免费下载链接】gh-proxy github release、archive以及项目文件的加速项目 项目地址: https://gitcode.com/gh_mirrors/gh/gh-proxy 诊断连接瓶颈 检测网络延迟指标 准备工作&#xff1a;确保系统已安装网络诊断工具&#xff08;Linux默…...

AI报告文档审核助力本地化升级:IACheck如何支撑食品加工行业数据安全与质量协同发展

在食品加工行业不断强化质量控制与数据安全要求的背景之下&#xff0c;“本地部署”正逐渐成为企业数字化转型中的关键路径之一&#xff0c;尤其是在涉及检测数据与质量报告的场景中&#xff0c;数据不仅需要具备高度准确性&#xff0c;还必须满足合规与安全要求&#xff0c;因…...

湖南石材结晶公司

在长沙&#xff0c;无论是高端商场、星级酒店&#xff0c;还是政务大厅、三甲医院&#xff0c;光洁如镜、平整如砥的石材地面&#xff0c;都是其专业形象与高端质感的直接体现。然而&#xff0c;石材作为“面子工程”&#xff0c;长期承受高频人流、设备碾压&#xff0c;极易出…...

html-to-docx:让HTML转Word不再头疼的开源解决方案

html-to-docx&#xff1a;让HTML转Word不再头疼的开源解决方案 【免费下载链接】html-to-docx HTML to DOCX converter 项目地址: https://gitcode.com/gh_mirrors/ht/html-to-docx 在数字化办公的浪潮中&#xff0c;文档格式转换已成为企业和个人的日常需求。据行业调研…...

别再手动标图了!用CVAT和YOLOv5搭建半自动标注流水线(保姆级避坑指南)

从零构建CVATYOLOv5半自动标注系统&#xff1a;工程化实践与效率革命 标注数据是AI开发中最耗时却无法绕过的环节。我曾为一个客户项目标注3万张工业零件图像&#xff0c;团队3人整整耗费两周——直到发现CVAT与训练好的YOLOv5模型结合&#xff0c;能将效率提升400%。本文将分…...