0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

以调试Rust的方式来学习Rust

jf_wN0SrCdH 来源:Linux中国 2023-01-03 14:56 次阅读
导读:Rustlings 是由 Rust 团队维护的开源项目,旨在帮助你通过调试代码的方式来学习 Rust。

在我上一篇关于 Rustup 的文章中,我向你们展示了如何安装 Rust 工具链。但是,如果不能上手操作一下 Rust 的话下载工具链又有什么用?学习任何语言都包括阅读现有的代码和写很多的示例程序,这是精通一门语言的好方法。然而,我们还可以走第三条路:调试代码。

通过调试来学习牵扯到尝试去编译一个已经写好的(满是漏洞的)示例程序,理解编译器生成的错误信息,修复示例代码,然后再重新编译。重复这个过程直到代码能够成功被编译并运行。

Rustlings是一个由 Rust 团队维护的开源项目,旨在帮助你通过调试代码来学习 Rust。它也会一路为你提供提示。如果你是一名 Rust 初学者,并且刚开始阅读或已经读完了 Rust 书籍,那么 Rustlings 就是理想的下一步。Rustllings 帮助你将运用书中所学,并转向开发更大的项目。

安装 Rustlings

我使用(并推荐)Fedora 电脑来体验 Rustlings,但是任何 Linux 发行版都可以。要安装 Rustlings,你必须下载并运行它的安装脚本。通常建议你以不具备任何特别权限的普通用户(非 root 用户)来运行脚本。

记住,你需要 Rust 工具链来使用 Rustlings。如果你还没有这些工具链,请参考我关于 Rustup 的文章。

当你准备好时,下载这个安装脚本:


		
  1. $ curl -L https://raw.githubusercontent.com/rust-lang/rustlings/main/install.sh > rustlings_install.sh
  2. $ file rustlings_install.sh
  3. rustlings_install.sh: Bourne-Again shell script, ASCII text executable

阅读脚本以了解它会做什么:


		
  1. $ less rustlings_install.sh

然后运行安装:


		
  1. $ bash rustlings_install.sh
  2. [...]
  3. Installing /home/tux/.cargo/bin/rustlings
  4. Installed package `rustlings v4.8.0 (/home/tux/rustlings)` (executable `rustlings`)
  5. All done!

运行rustlings以开始。

Rustlings 练习

你现在可以使用命令rustlings。与标志--help一起执行来查看可选的选项。


		
  1. $ rustlings --help

这个安装脚本也克隆了 Rustlings 的 Git 仓库,并安装了运行示例程序所需的依赖。你可以在ruslings下的exercises目录查阅这些示例程序。


		
  1. $ cd rustlings
  2. $ pwd
  3. /home/tux/rustlings
  4. $ ls
  5. AUTHORS.md Cargo.toml CONTRIBUTING.md info.toml install.sh README.md target Cargo.lock CHANGELOG.md exercises install.ps1 LICENSE src tests
  6. $ ls -m exercises/
  7. advanced_errors, clippy, collections, conversions, enums, error_handling, functions, generics, if, intro, macros, mod.rs,
  8. modules, move_semantics, option, primitive_types, quiz1.rs, quiz2.rs, quiz3.rs, quiz4.rs, README.md,
  9. standard_library_types, strings, structs, tests, threads, traits, variables

从命令行列出所有练习

命令ruslings提供给你一个list命令用以展示每个示例程序,它的完整路径,以及状态 (默认为 “待定”)。


		
  1. $ rustlings list
  2. Name Path Status
  3. intro1 exercises/intro/intro1.rs Pending
  4. intro2 exercises/intro/intro2.rs Pending
  5. variables1 exercises/variables/variables1.rs Pending
  6. variables2 exercises/variables/variables2.rs Pending
  7. variables3 exercises/variables/variables3.rs Pending
  8. [...]

在显示结尾处,你会有一个进度报告用来追踪进度。


		
  1. Progress: You completed 0 / 84 exercises (0.00 %).

查看示例程序

命令rustlings list向你展示了现有的程序,所以你可以在任何时候查看这些程序的代码,你只需要将完整路径复制到你的终端作为命令cat opensource.com或者less opensource.com的参数


		
  1. $ cat exercises/intro/intro1.rs

验证你的程序

现在你可以开始调试程序了。你可以使用命令verify来做这件事。注意 Rustlings 选择了列表里的第一个程序(intro1.rs)并尝试去编译它,最后编译成功:


		
  1. $ rustlings verify
  2. Progress: [-----------------------------------] 0/84
  3. Successfully ran exercises/intro/intro1.rs!
  4. You can keep working on this exercise,
  5. or jump into the next one by removing the `I AM NOT DONE` comment:
  6. 6 | // Execute the command `rustlings hint intro1` for a hint.
  7. 7 |
  8. 8 | // I AM NOT DONE
  9. 9 |

正如你从结果中所见,尽管示例代码成功编译了,你依然需要做一些工作。每个示例程序的源文件中都带有以下注释:


		
  1. $ grep "NOT DONE" exercises/intro/intro1.rs
  2. // I AM NOT DONE

虽然第一个程序的编译没有问题,除非你去掉注释I AM NOT DONE,Rustlings 不会移到下一个程序。

来到下一个练习

一旦你从intro1.rs中去掉这些注释,你就可以通过再一次运行命令rustlings verify来到下一个练习。这一次,你会发现 Rustlings 尝试去编译这个系列中的下一个程序(intro2.rs),但是遇到了一个错误。你应该调试并修复这个问题,并前进。这是你理解为什么 Rust 说程序有漏洞的至关重要的一步。


		
  1. $ rustlings verify
  2. Progress: [>------------------------] 1/84
  3. Compiling of exercises/intro/intro2.rs failed! Please try again. Here's the output:
  4. error: 1 positional argument in format string, but no arguments were given
  5. --> exercises/intro/intro2.rs21
  6. |
  7. 8 | println!("Hello {}!");
  8. | ^^
  9. error: aborting due to previous error

来点提示

Rustlings 有一个非常好用的hint参数,这个参数会告诉你示例程序中哪里出错了,以及如何去修复它。你可以认为这是在编译错误信息基础之上,一个额外的帮助选项。


		
  1. $ rustlings hint intro2
  2. Add an argument after the format string.

基于以上提示,修复这个程序就很简单了。你只需要在语句println中加一个额外的参数。这个 diff 对比应该能帮你理解发生的变化:


		
  1. < println!("Hello {}!", "world");
  2. ---
  3. > println!("Hello {}!");

一旦你做出了修改,并从源代码中去掉了注释NOT DONE,你可以再一次运行rustlings verify来编译并运行代码。


		
  1. $ rustlings verify
  2. Progress: [>-------------------------------------] 1/84
  3. Successfully ran exercises/intro/intro2.rs!

追踪进度

你无法在一天之内做完所有的练习,忘记练到哪也很常见。你可以执行命令list来查看你的练习状态。


		
  1. $ rustlings list
  2. Name Path Status
  3. intro1 exercises/intro/intro1.rs Done
  4. intro2 exercises/intro/intro2.rs Done
  5. variables1 exercises/variables/variables1.rs Pending
  6. variables2 exercises/variables/variables2.rs Pending
  7. variables3 exercises/variables/variables3.rs Pending
  8. [...]

运行特定的练习

如果你不想从头开始并且想要跳过一些练习,Rustlings 允许你使用命令rustlings run来专注特定的练习。如此可以运行指定的程序而不需要验证之前的课程。例如:


		
  1. $ rustlings run intro2
  2. Hello world!
  3. Successfully ran exercises/intro/intro2.rs
  4. $ rustlings run variables1

敲入练习名字可能会变得乏味,但 Rustlings 为你准备了便利的命令next用来移向系列中的下一个练习。


		
  1. $ rustlings run next

替代命令 watch

如果你不想在每次修改后还要敲一次verify,你可以在终端窗口中运行命令watch,然后再继续修改源代码以解决问题。命令watch检测到这些修改,然后重新编译以查看这些问题是否被解决。


		
  1. $ rustlings watch

通过调试学习

Rust 编译器以提供非常有意义的错误信息而被熟知,这些错误信息会帮助你理解在你代码中的问题。这通常意味着更快的调试。Rustlings 是练习 Rust,学会阅读错误信息,并理解 Rust 语言的优秀途径。来看看GitHub上 Rustlings 5.0.0 的最新功能吧。

审核编辑:汤梓红


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10990

    浏览量

    206730
  • 调试
    +关注

    关注

    7

    文章

    527

    浏览量

    33624
  • 代码
    +关注

    关注

    30

    文章

    4555

    浏览量

    66750
  • Rust
    +关注

    关注

    1

    文章

    223

    浏览量

    6387

原文标题:以调试 Rust 的方式来学习 Rust | Linux 中国

文章出处:【微信号:Rust语言中文社区,微信公众号:Rust语言中文社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Rust GUI实践之Rust-Qt模块

    Rust-Qt 是 Rust 语言的一个 Qt 绑定库,它允许 Rust 开发者使用 Qt 框架来创建跨平台的图形界面应用程序。Qt 是一个跨平台的应用程序框架,它提供了一系列的工具和库,可以帮助
    的头像 发表于 09-30 16:43 960次阅读

    Rust的多线程编程概念和使用方法

    Rust是一种强类型、高性能的系统编程语言,其官方文档中强调了Rust的标准库具有良好的并发编程支持。Thread是Rust中的一种并发编程方式,本文将介绍
    的头像 发表于 09-20 11:15 503次阅读

    只会用Python?教你在树莓派上开始使用Rust

    硬件程序。按 Ctrl-C 退回到终端。如果有任何错误,请彻底检查代码,检查是否缺少任何冒号,分号或方括号。Raspberry Pi上的Rust令人兴奋的未来当前,Python并非如此可能会被Rust取代。它很容易
    发表于 05-20 08:00

    如何用 rust 语言开发 stm32

    本文介绍如何用 rust 语言开发 stm32。开发平台为 linux(gentoo)。硬件准备本文使用的芯片为 STM32F103C8T6。该芯片性价比较高,价格低廉,适合入门学习。需要
    发表于 11-26 06:20

    怎样去使用Rust进行嵌入式编程呢

    使用Rust进行嵌入式编程Use Rust for embedded development篇首语:Rust的高性能、可靠性和生产力使其适合于嵌入式系统。在过去的几年里,Rust在程序
    发表于 12-22 07:20

    RUST在嵌入式开发中的应用是什么

    Rust是一种编程语言,它使用户能够构建可靠、高效的软件,尤其是用于嵌入式开发的软件。它的特点是:高性能:Rust具有惊人的速度和高内存利用率。可靠性:在编译过程中可以消除内存错误。生产效率:优秀
    发表于 12-24 08:34

    如何利用C语言去调用rust静态库呢

    新语言的感觉,要做不少的对接工作。也用过Lua,感觉也差不多。评估学习评估Rust语言时,感觉性能和体积应该都不会有太大的问题。加上语言本身主打的安全性,再结合一些库,用来做一些C语言不擅长的动态操作
    发表于 06-21 10:27

    如何在STM32 (Cortex M3)和GD32(RISC-V)上用Rust开发

    (ISA) 特别多,如果一门语言想要应用到嵌入式,首先自然是得能编译出兼容不同指令集的程序。Rust 早期编译器是 rustc 提供代理 (proxy),将编译任务传递到后端实际的编译器进行编译,这样
    发表于 06-21 10:38

    Rust代码中加载静态库时,出现错误 ` rust-lld: error: undefined symbol: malloc `怎么解决?

    “ [i]malloc ”、“ [i]exit ”。我验证了使用 ` [i]nm ` 命令。 问题是我打算使用 ffi 在 rust 中使用这个静态库。当我尝试在我的 Rust 代码中加载静态库
    发表于 06-09 08:44

    Rust 1.68.1发布修复了回归问题

    Rust 1.68.1发布,修复了回归问题 Rust 1.68.1发布,修复了一些回归问题。主要修复了以下问题: Rust CI对于Windows MSVC编译器的构建方式,不再对
    的头像 发表于 03-27 14:43 280次阅读

    rust语言基础学习: 智能指针之Cow

    Rust中与借用数据相关的三个trait: Borrow, BorrowMut和ToOwned。理解了这三个trait之后,再学习Rust中能够实现写时克隆的智能指针Cow。
    的头像 发表于 05-22 16:13 2003次阅读

    rust语言基础学习: rust中的错误处理

    错误是软件中不可避免的,所以 Rust 有一些处理出错情况的特性。在许多情况下,Rust 要求你承认错误的可能性,并在你的代码编译前采取一些行动。
    的头像 发表于 05-22 16:28 1384次阅读

    Rust的内部工作原理

    或智能指针传递self时生成的汇编方式 Rust递归树生成的汇编代码 更多见原文链接 原文链接: https://www.eventhelix.com/rust/ libtracecmd-rs
    的头像 发表于 06-14 10:34 463次阅读
    <b class='flag-5'>Rust</b>的内部工作原理

    谷歌程序员认为学习Rust很easy

    谷歌内部调查显示,超过 2/3 的受访者有信心在学习 Rust 时,用两个月或更短时间内就能为 Rust 代码库做出贡献。此外, 1/3 的受访者在两个月或更短的时间内使用 Rust
    的头像 发表于 07-03 14:56 300次阅读
    谷歌程序员认为<b class='flag-5'>学习</b><b class='flag-5'>Rust</b>很easy

    从Rustup出发看Rust编译生态

    从Rustup出发看Rust编译生态 1. Rust和LLVM的关系是怎样的? 2. Rustup中targets是什么,为什么可以安装多个? 3. Rust在windows上为什么需要安装Visual studio?
    的头像 发表于 01-02 11:00 237次阅读