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
文件,你会看到一些注释,其中提到以下内容:
//
表示单行注释。TODO
或todo!()
,以及__
,用于强调你需要在练习中完成的部分。- 代码的检查直接使用了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内存管理
虚拟内存 虚拟内存是一种操作系统提供的机制,用于将每个进程分配的独立的虚拟地址空间映射到实际的物理内存地址空间上。通过使用虚拟内存,操作系统可以有效地解决多个应用程序直接操作物理内存可能引发的冲突问题。 在使用虚拟内存的情况下࿰…...

Java每日一练_模拟面试题5(堆和栈的区别)
在Java中,堆(Heap)和栈(Stack)是两个不同的内存区域,它们在存储内容、管理方式、空间大小、分配方式等多个方面存在显著的区别。以下是Java中堆和栈的主要区别: 1. 存储内容不同 堆࿱…...

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

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

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

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

Ubuntu 24.04上报:Error: could not connect to ollama app, is it running?的解决方法
说起来这个问题真实让人无语。按照我之前说过的方法:设置Ollama在局域网中访问的方法(Ubuntu)_ollama 局域网访问-CSDN博客 把Ollama的默认端口修改后,如果再运行: ollama ps 则会报下面的错: Error: c…...

字典树查重(到底要开多大的空间啊)
前言:烦死了,这个题目一看就是用字典树来做,但是空间不知道开多大,烦死了 后来发现其实tree的第一维空间直接开极端的情况就行,就好像这一题,最多有 1e4 个字符串,每个字符串最长为 50ÿ…...

财务会计与管理会计(二)
文章目录 多工作表销售数据汇总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树的定义 树也称树,它是一颗多路平衡查找树。我们描述一颗树时需要指定它的阶数,阶数表示了一个结点最多有多少个孩子结点,用字母表示阶数。当取时,就是我们常见的二叉搜索树。 一颗阶的树定义如下: 每…...

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

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

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

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

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

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

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

优购电商小程序的设计
管理员账户功能包括:系统首页,个人中心,用户管理,商品分类管理,商品信息管理,留言板管理,订单管理,系统管理 微信端账号功能包括:系统首页,商品信息…...

【ARM】v8架构programmer guide(4)_ARMv8的寄存器
目录 4.4Endianness(端序或字节序) 4.5 改变execution state 4.5.1 Registers at AArch32 4.5.2 PSTATE at AArch32 4.6 NEON 和浮点数寄存器 4.6.1 AArch64中浮点寄存器的组织结构 4.6.2 标量寄存器大小 4.6.3 向量寄存器大小 4.6.4 NEON在AArc…...

Java设计模式详细讲解
目录 设计模式概述 1.1 什么是设计模式1.2 设计模式的类型1.3 设计模式的历史与发展1.4 设计模式在软件开发中的重要性 创建型模式 2.1 单例模式2.2 工厂方法模式2.3 抽象工厂模式2.4 建造者模式2.5 原型模式 结构型模式 3.1 适配器模式3.2 装饰器模式3.3 代理模式3.4 外观模…...

图论------弗洛伊德(Floyd-Warshall)算法
题目描述: 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的 T-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助…...

C#实现动画效果
在C#中,实现动画效果通常可以使用Windows Forms的Timer类或者使用System.Windows.Media.Animation命名空间下的类(如果是WPF应用)。以下是一个Windows Forms应用中使用Timer类来创建简单的动画效果的例子。 假设我们有一个窗体(F…...

Git 对比 SVN 的区别和优势
引言 版本控制系统(VCS)是软件开发过程中不可或缺的一部分,它们用于管理代码的变更、协调开发团队的工作。Git 和 SVN(Apache Subversion)是目前最流行的两个版本控制系统。本文将详细分析 Git 和 SVN 的区别及各自的…...

Qt实现无边框窗口的拖动和缩放
在使用QT创建窗体的时候,为了使窗口美化,通常不使用QT自带的边框。会调用下面函数去除窗体边框。 setWindowFlags(Qt::FramelessWindowHint) 但是有个问题,当去除了QT自带边框后,窗体就变得不能移动了,也不能改变窗口大…...

入门岛2-python实现wordcount并进行云端debug
书生大模型学习 任务: 1.实现一个wordcount函数,统计英文字符串中每个单词出现的次数。返回一个字典,key为单词,value为对应单词出现的次数。 2.Vscode连接InternStudio debug TIPS:记得先去掉标点符号,然后把每个单词…...

c语言-链表1
10 链表 一、链表是什么? -- 数据的一种存储方式 -- 链式存储 (1)线性存储 -- 地址连续 -- 自动开辟,自动释放 -- 默认是线性存储 (2)链式存储 -- 地址不连续…...

你好! Git——企业级开发模型
企业级开发模型(6) 一、删除远程分支,git branch -a (查看所有本地分支与远程分支)还能看到已经删除的分支,怎么解决?二、企业级开发流程2.1 企业级开发流程2.2 系统开发环境 三、Git分支设计模…...