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】 语法、整数、变量

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

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

相关文章

docker技术中docker-compose与harbor技术

docker-composeharbor docker网络概念 当大规模使用docker时,容器间通信就成了一个问题。 docker支持的四种网络模式在run时指定 host模式 --nethost 容器和宿主机共享一个网络命名空间 container模式 --net{容器id} 多个容器共享一个网络 none模式 --netnone …

【深度学习】TTS,CosyVoice,推理部署的代码原理讲解分享

文章目录 demo代码加载配置文件speech_tokenizer_v1.onnx(只在zero_shot的时候使用)campplus.onnx(只为了提取说话人音色embedding)`campplus_model` 的作用代码解析具体过程解析总结示意图CosyVoiceFrontEndCosyVoiceModel推理过程总体推理过程推理速度很慢: https://git…

基于Python爬虫+机器学习的长沙市租房价格预测研究

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

数据库(三):DML

DML,全称Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进行增、删、改、查。 一、添加数据(INSERT) 注意事项: ①插入数据时,指定的字段顺序需要与值的顺序…

手机在网时长查询接口如何对接?(二)

一、什么是手机在网时长查询接口? 传入手机号码,查询该手机号的在网时长,返回时间区间,支持携号转网号码查询。 二、手机在网时长查询接口适用于哪些场景? 比如:信用评估辅助 (1&#xff09…

二叉树建堆全过程(数组实现)

定义 typedef int HPDataType;typedef struct Heap {HPDataType* a;//用数组存数据int size;//当前数组存放数据的数量int capacity;//数组容量}HP; 即将要实现的功能 void HPInit(HP* php);//初始化 void HPPush(HP* php, HPDataType x);//堆尾插入数据(数组尾部…

论文阅读:Efficient Core Maintenance in Large Bipartite Graphs | SIGMOD 2024

还记得我们昨天讨论的《Querying Historical Cohesive Subgraphs over Temporal Bipartite Graphs》这篇论文吗? https://blog.csdn.net/m0_62361730/article/details/141003301 这篇(还没看的快去看) 这篇论文主要研究如何在时间双向图上查询历史凝聚子图,而《E…

深度学习入门指南(1) - 从chatgpt入手

2012年,加拿大多伦多大学的Hinton教授带领他的两个学生Alex和Ilya一起用AlexNet撞开了深度学习的大门,从此人类走入了深度学习时代。 2015年,这个第二作者80后Ilya Sutskever参与创建了openai公司。现在Ilya是openai的首席科学家,…

手机误操作导致永久删除照片的恢复方法有哪些?

随着手机功能的不断增强和应用程序的不断丰富,人们越来越依赖手机,离不开手机。但有时因为我们自己的失误操作,导致我们手机上重要的照片素材被永久删除,这时我们需要怎么做,才能找回我们被永久删除的照片素材呢&#…

Langchain框架深度剖析:解锁大模型-RAG技术的无限潜能,引领AI应用新纪元

文章目录 前言一、Langchain 框架概述二、大模型-RAG技术原理三、应用示例1.RAG案例一(私有文档直接读取-问答)2.RAG案例二(Vue上传文件结合文件内容回答问题)3.RAG案例三(Vue秒传文件结合文件内容回答问题&#xff09…

无字母数字webshell命令执行

<?php if(isset($_GET[code])){$code $_GET[code];if(strlen($code)>35){die("Long.");}if(preg_match("/[A-Za-z0-9_$]/",$code)){die("NO.");}eval($code); }else{highlight_file(__FILE__); }限制&#xff1a; 1.webshell长度不超过…

【海思SS626 | 内存管理】海思芯片的OS内存、MMZ内存设置

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

基于jsp的宠物领养与服务管理系统(源码+论文+部署讲解等)

博主介绍&#xff1a;✌全网粉丝10W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术栈介绍&#xff1a;我是程序员阿龙&#xff…

【SpringBoot】自定义注解<约定式i18n国际化>终极升级版方案源码Copy

零、前言 在后端对于 SpringBoot 的 数据库数据&#xff0c;需要国际化的字段和主要显示字段是分离的&#xff0c;为了避免大耦合性&#xff0c;与用户端的国际化字段处理问题&#xff0c;统一采用主要显示数据的实体字段。为此&#xff0c;我设计了一套解决方案&#xff0c;通…

el-form-item,label在上方显示,输入框在下方展示

本来是两排展示去写&#xff0c;设计要求一排展示&#xff0c;label再上方&#xff0c;输入框、勾选框在下方&#xff1b;只能调整样式去修改&#xff1b;参考label-position这个属性 代码如下&#xff1a; <el-form ref"form" :model"formData" clas…

React应用(基于react脚手架)

react脚手架 1.xxx脚手架&#xff1a;用来帮助程序员快速创建一个基于xxx库的模板项目 包含了所有需要的配置&#xff08;语法检查&#xff0c;jsx编译&#xff0c;devServer&#xff09;下载好了所有相关的依赖可以直接运行一个简单结果 2.react提供了一个用于创建react项目…

AWVS——Web 应用漏洞扫描的强大工具

一、引言 在网络安全日益重要的今天&#xff0c;Web 应用的安全性备受关注。Acunetix Web Vulnerability Scanner&#xff08;简称 AWVS&#xff09;作为一款知名的 Web 应用漏洞扫描工具&#xff0c;为保障 Web 应用的安全发挥了重要作用。本文将详细介绍 AWVS 的功能、特点、…

【vulhub靶场之spring】——

简介&#xff1a; Spring是Java EE编程领域的一个轻量级开源框架&#xff0c;该框架由一个叫Rod Johnson的程序员在2002年最早提出并随后创建&#xff0c;是为了解决企业级编程开发中的复杂性&#xff0c;业务逻辑层和其他各层的松耦合问题&#xff0c;因此它将面向接口的编程思…

【Postman工具】

一.接口扫盲 1.什么是接口&#xff1f; 接口是系统之间数据交互的通道。拿小红到沙县点餐为例&#xff1a;小红想吃鸭腿饭。她要用什么语言来表达&#xff1f;跟谁表达&#xff1f;通过什么表达&#xff1f;按照生活习惯应该是&#xff1a;小红根据菜单对服务员用中文表达她想要…

联通数科如何基于Apache DolphinScheduler构建DataOps一体化能力平台

各位小伙伴晚上好&#xff0c;我是联通数字科技有限公司数据智能事业部的王兴杰。 更好的阅读体验可前往原文阅读:巨人肩膀 | 联通数科如何基于Apache DolphinScheduler构建DataOps一体化能力平台 今天&#xff0c;我将和大家聊一聊联通数字科技有限公司是如何基于Apache Dol…