首页 > 其他分享 >Rust极简教程

Rust极简教程

时间:2022-08-29 17:58:11浏览次数:81  
标签:极简 教程 name sex stu score Student Rust

据说,Rust语言语法的高门槛是劝退很多人上手的主要原因。

确实,Rust语言希望解决 C/C++ 手工管理内存的问题,但是又不想引入类似golang,java的GC机制。
因此,为了能让编译器能够在编译阶段检查出潜在的内存问题,Rust的语法上就多了一些其他语言所没有的规则,这些规则让上手Rust的难度提高了不少。

我是觉得,学习一门编程语言,不一定要弄懂其中的所有概念才能开始写代码,就像我们学习外语,掌握了基本几句话之后其实就可以开始对话练习。

这篇极简教程的目的,其实不只是针对Rust,任何编程语言都可以有这么一个极简教程,让大家可以尽快用这种编程语言先把代码写起来,边写边学,不断加深对语言的理解。

因为是极简教程,大纲也很简单,主要3部分:

  1. 工程管理
  2. 变量定义
  3. 流程控制

《C程序设计语言》中有一句很经典话:程序 = 数据结构 + 算法
上面的【变量定义】其实就是数据结构,【流程控制】就是算法,有了这2部分其实就可以编写各种功能。
最后加了【工程管理】这部分,一方面是因为Rust的管理工具Cargo是它的重要特色之一;另一方面,良好的代码组织是完成复杂功能的基础,毕竟我们学习Rust,最后是希望用它去完成实际的业务功能的。

工程管理

通过 cargo 创建 Rust项目,可以更好的管理项目的依赖,打包和升级等等。
所以,尽管是极简教程,还是希望能用 cargo 来管理项目。

Rust项目一般有两种类型,可执行文件和库。
我们一般做的软件或者工具最终都会发布成可执行文件,给用户使用。
而库不能单独运行,一般是对重要的功能进行封装,然后作为其他软件的一部分来使用。

创建可执行文件

cargo new rust-examples
tree .  # 工程结构如下
.
├── Cargo.toml # 这里是工程的配置
└── src
    └── main.rs


其中 main.rs 是启动文件,学习Rust各种语法的时候,可以将代码写在 main.ts 中进行测试。

创建库

cargo new --lib rust-lib
tree .
.
├── Cargo.toml  # 这里是工程的配置
└── src
    └── lib.rs

这里的 lib.rs 和 main.rs 不同,它是不能直接运行的,需要通过里面的测试代码来运行相应的功能。

变量定义

Rust的基本类型和其他语言大同小异,熟悉其他语言(C/C++, golang等)的话,很容易理解。
这里我们构造一个简单的学生成绩管理系统,通过定义学生信息,演示下Rust中基本类型以及枚举和结构体的使用。

cargo new stu_manager

在 src/main.rs 中定义并打印学生信息。

#[derive(Debug)]
enum Sex {
    Boy,
    Girl,
}

struct Student {
    name: String, // 姓名
    age: u16,     // 年龄
    sex: Sex,     // 性别
    score: f32,   // 成绩
}

fn main() {
    let students: [Student; 2] = [
        Student {
            name: String::from("boy01"),
            age: 18,
            sex: Sex::Boy,
            score: 61.5,
        },
        Student {
            name: String::from("girl01"),
            age: 16,
            sex: Sex::Girl,
            score: 91.5,
        },
    ];

    display(&students[0]);
    display(&students[1]);
}

fn display(stu: &Student) {
    println!(
        "name: {}, age: {}, sex:{:?}, score: {}",
        stu.name, stu.age, stu.sex, stu.score
    );
}

说明:

  1. #[derive(Debug)]这个是为了打印enum,否则enum类型是不能直接打印的。
  2. struct Student这个结构体中定义了常用的基本类型的使用方式。
  3. let students: [Student; 2]Rust数组的定义方式。

与其他语言相比,Rust变量的一个新的概念就是所有权和借用规则,我的另一篇博客中有介绍,这里不在赘述。
Rust所有权和借用规则示例

除此之外,使用的方式和其他语言区别不大,上面示例中,创建了2个学生信息,并且分别打印出其中各个字段的信息。

$ cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.01s
Running `target/debug/stu_manager`
name: boy01, age: 18, sex:Boy, score: 61.5
name: girl01, age: 16, sex:Girl, score: 91.5

流程控制

掌握了变量定义,可以组织我们的数据,再掌握Rust中的流程控制方法,那么,就能实现实际的业务功能了。

流程控制主要两种:分支和循环。

分支

Rust的分支语法有 ifmatch两种方式。

继续完善上面的例子,我们增加一个根据成绩区分优良中差的函数,用 if的方式来判断分支。

fn check_score(stu: &Student) {
    if stu.score >= 90.0 {
        println!("学员:{}, 成绩优秀", stu.name);
    } else if stu.score < 90.0 && stu.score >= 75.0 {
        println!("学员:{}, 成绩良好", stu.name);
    } else if stu.score < 75.0 && stu.score >= 60.0 {
        println!("学员:{}, 成绩中等", stu.name);
    } else {
        println!("学员:{}, 成绩不合格!!!", stu.name);
    }
}

再增加一个判断性别的函数,用match的方式来判断分支。

fn check_sex(stu: &Student) {
    match stu.sex {
        Sex::Boy => println!("学员: {} 是男生", stu.name),
        Sex::Girl => println!("学员: {} 是女生", stu.name),
    }
}

循环

Rust 循环主要有3种方式:

  1. loop 无限循环,自己控制循环退出
  2. while 条件循环
  3. for 条件循环

下面用3种循环方式分别打印学生信息,学生成绩信息以及学生性别信息。

    // loop 循环示例
    let mut count = 0;
    loop {
        if count == students.len() {
            break;
        }

        display(&students[count]);
        count += 1;
    }

    // while 循环示例
    count = 0;
    while count < students.len() {
        check_score(&students[count]);
        count += 1;
    }

    // for 循环示例
    for stu in students {
        check_sex(&stu);
    }

3种循环中,还是 for循环最为见解,这也是我们使用最多的循环方式。

总结

这里可以看出,只要会任何一种编程语言,几乎不需要太多Rust特有的知识,我们也可以用Rust来编写代码。

当然,Rust的优势,比如内存安全和高性能,这里并没有体现。
这篇博客的目的是希望能够尽快将Rust用起来,用起来之后,遇到问题解决问题,在用的过程中逐步理解Rust的高阶概念和语法,一步一步成为Rust高手。

附录

完整的示例如下:

#[derive(Debug)]
enum Sex {
    Boy,
    Girl,
}

struct Student {
    name: String, // 姓名
    age: u16,     // 年龄
    sex: Sex,     // 性别
    score: f32,   // 成绩
}

fn main() {
    let students: [Student; 2] = [
        Student {
            name: String::from("boy01"),
            age: 18,
            sex: Sex::Boy,
            score: 61.5,
        },
        Student {
            name: String::from("girl01"),
            age: 16,
            sex: Sex::Girl,
            score: 91.5,
        },
    ];

    // loop 循环示例
    let mut count = 0;
    loop {
        if count == students.len() {
            break;
        }

        display(&students[count]);
        count += 1;
    }

    // while 循环示例
    count = 0;
    while count < students.len() {
        check_score(&students[count]);
        count += 1;
    }

    // for 循环示例
    for stu in students {
        check_sex(&stu);
    }
}

fn display(stu: &Student) {
    println!(
        "name: {}, age: {}, sex:{:?}, score: {}",
        stu.name, stu.age, stu.sex, stu.score
    );
}

fn check_score(stu: &Student) {
    if stu.score > 100.0 {
        println!("学员:{}, 成绩错误", stu.name);
    } else if stu.score <= 100.0 && stu.score >= 90.0 {
        println!("学员:{}, 成绩优秀", stu.name);
    } else if stu.score < 90.0 && stu.score >= 75.0 {
        println!("学员:{}, 成绩良好", stu.name);
    } else if stu.score < 75.0 && stu.score >= 60.0 {
        println!("学员:{}, 成绩中等", stu.name);
    } else {
        println!("学员:{}, 成绩不合格!!!", stu.name);
    }
}

fn check_sex(stu: &Student) {
    match stu.sex {
        Sex::Boy => println!("学员: {} 是男生", stu.name),
        Sex::Girl => println!("学员: {} 是女生", stu.name),
    }
}

$ cargo run
   Compiling stu_manager v0.1.0 (/home/wangyubin/projects/rust/stu_manager)
    Finished dev [unoptimized + debuginfo] target(s) in 0.60s
     Running `target/debug/stu_manager`
name: boy01, age: 18, sex:Boy, score: 61.5
name: girl01, age: 16, sex:Girl, score: 91.5
学员:boy01, 成绩中等
学员:girl01, 成绩优秀
学员: boy01 是男生
学员: girl01 是女生

标签:极简,教程,name,sex,stu,score,Student,Rust
From: https://www.cnblogs.com/wang_yb/p/16636774.html

相关文章

  • 0025-Rust-自实现迭代器
    环境Time2022-05-21Rust1.61.0前言说明参考:https://doc.rust-lang.org/std/iter/trait.IntoIterator.html目标前一节自定义了一个类型来实现迭代器,并且自定义了......
  • 0023-Rust-自实现迭代器
    环境Time2022-05-19Rust1.60.0前言说明参考:https://doc.rust-lang.org/std/iter/index.html目标针对自定义类型,实现一个迭代器。自定义类型#[derive(Default,......
  • 我在 Rust 中的第一个真实代码
    我在Rust中的第一个真实代码每种语言都始于游乐场。你可以在那里做一些令人惊奇的事情,但它们就像邻近的儿童沙饼一样令人惊奇。一旦你从操场进入“做一些真正的事情”,......
  • After Effects 教程,如何在 After Effects 中使用运动模糊?
    欢迎观看AfterEffects中文版教程,小编带大家学习AfterEffects的基本工具和使用技巧,了解如何在AE中使用运动模糊。在「时间轴」面板的空白区域单击一次,确保它处于活......
  • Discuz!X3.2/3.3/3.4程序搬家/数据库修改教程 (2019-06-11 17:07:29)
    路径:/wwwroot/config/config_global.php这个根据你网站安装的路径而定。 打开config_global.php文件修改:$_config['db']['1']['dbpw']='原来密码'; 原来密码......
  • 正则表达式菜鸟教程
    地址: https://c.runoob.com/front-end/854一、校验数字的表达式数字:^[0-9]*$n位的数字:^\d{n}$至少n位的数字:^\d{n,}$m-n位的数字:^\d{m,n}$零和非零开头的数字:^(0|[1-9]......
  • 使用 vue 开发 APICloud 应用的教程
    文档目录一、APICloud创建程序1、APICloud后台创建应用2、APICloud拉取代码,APICloud开发工具地址APICloud开发工具PC端,先下载APICloud开发工具,打开开发工具......
  • 图数据库入门教程(十三)怎么坐地铁最快?
    两站之间最短路径gremlin提供了repeat..until语法来循环执行一个逻辑,直到满足某个条件。通过repeat..until来进行最短路径查询非常适合。下面语句来查询西单地铁站到东单......
  • VM虚拟机安装教程
    1、安装vm虚拟机软件1.1官网自己下载最新版1.2双击打开虚拟机文件 1.3根据向导安装     安装好了不要着急点完成在安装目录中有许可证。   ......
  • 图数据库入门教程(十一)local
    local的用法求地铁站直接连接地铁站数量的平均数,一般一个地铁站联通着两个站,上一站下一站,但是如果是换乘车站,连接数量可能多一些g.V().has("station","name","农大南路")......