Rust语言实战

通过实践学习 Rust,通过具有挑战性的示例、练习和项目,缩小初学者和熟练开发人员之间的差距。「Learning Rust By Practice, narrowing the gap between beginner and skilled-dev through challenging examples, exercises and projects.」

Github星跟踪图

Stars Count Forks Count
LICENSE

This book was designed for easily diving into and get skilled with Rust, and it's very easy to use: All you need to do is to make each exercise compile without ERRORS and Panics !

Reading online

Running locally

We use mdbook building our exercises. You can run locally with below steps:

$ cargo install mdbook
$ cd rust-by-practice && mdbook serve 

Features

Part of our examples and exercises are borrowed from Rust By Example, thanks for your great works!

Although they are so awesome, we have our own secret weapons :)

  • There are three parts in each chapter: examples, exercises and practices

  • Besides examples, we have a lot of exercises, you can Read, Edit and Run them ONLINE

  • Covering nearly all aspects of Rust, such as async/await, threads, sync primitives, optimizing, standard libraries, tool chain, data structures and algorithms etc.

  • Every exercise has its own solutions

  • The overall difficulties are a bit higher and from easy to super hard: easy 🌟 medium 🌟🌟 hard 🌟🌟🌟 super hard 🌟🌟🌟🌟

What we want to do is fill in the gap between learning and getting started with real projects.

Some of our exercises

🌟🌟🌟 Tuple struct looks similar to tuples, it has added meaning the struct name provides but has no named fields. It's useful when you want give the whole tuple a name, but don't care the fields's names.


// fix the error and fill the blanks
struct Color(i32, i32, i32);
struct Point(i32, i32, i32);
fn main() {
    let v = Point(___, ___, ___);
    check_color(v);
}

fn check_color(p: Color) {
    let (x, _, _) = p;
    assert_eq!(x, 0);
    assert_eq!(p.1, 127);
    assert_eq!(___, 255);
 }

🌟🌟 Within the destructuring of a single variable, both by-move and by-reference pattern bindings can be used at the same time. Doing this will result in a partial move of the variable, which means that parts of the variable will be moved while other parts stay. In such a case, the parent variable cannot be used afterwards as a whole, however the parts that are only referenced (and not moved) can still be used.


// fix errors to make it work
#[derive(Debug)]
struct File {
    name: String,
    data: String,
}
fn main() {
    let f = File {
        name: String::from("readme.md"),
        data: "Rust By Practice".to_string()
    };

    let _name = f.name;

    // ONLY modify this line
    println!("{}, {}, {:?}",f.name, f.data, f);
}

🌟🌟 A match guard is an additional if condition specified after the pattern in a match arm that must also match, along with the pattern matching, for that arm to be chosen.


// fill in the blank to make the code work, `split` MUST be used
fn main() {
    let num = Some(4);
    let split = 5;
    match num {
        Some(x) __ => assert!(x < split),
        Some(x) => assert!(x >= split),
        None => (),
    }
}

主要指标

概览
名称与所有者sunface/rust-by-practice
主编程语言Rust
编程语言Shell (语言数: 5)
平台
许可证Creative Commons Attribution 4.0 International
所有者活动
创建于2018-04-18 02:13:19
推送于2025-04-25 04:48:07
最后一次提交2025-04-25 12:47:31
发布数0
用户参与
星数13k
关注者数69
派生数1.1k
提交数773
已启用问题?
问题数189
打开的问题数43
拉请求数193
打开的拉请求数5
关闭的拉请求数81
项目设置
已启用Wiki?
已存档?
是复刻?
已锁定?
是镜像?
是私有?