RustRover

安装

  • 安装后新建项目,提示安装 Rustup,安装后提示安装 vs studio 社区版和 windows sdk(不安装)
  • 根据提示安装中文语言包
  • 转为经典UI

使用gcc

安装工具链:

rustup toolchain install stable-x86_64-pc-windows-gnu
rustup default stable-x86_64-pc-windows-gnu

创建一个项目 test_rust (注意用 snack case方式命名,否则有讨厌的warning)

双击CTRL 输入: cargo build --release, 运行后编辑配置,参照run的配置设置命令 run --package test_rust --bin test_rust --release, 用于生成release 版本。

无法安装grcov

使用MSVC(推荐)

win10的LTS版本可能装不了2022版本的 visual studio

创建一个项目 test_rust (注意用 snack case方式命名,否则有讨厌的warning)

点击 run ‘run’ with coverage, 会提示安装 grcov

双击CTRL 输入: cargo build --release, 运行后编辑配置,参照run的配置设置命令 run --package test_rust --bin test_rust --release, 用于生成release 版本。

快捷键

  • 代码格式化 CTRL + ALT + L

<<Rust 程序设计语言>>笔记

中文版:https://rustwiki.org/zh-CN/book/

fn main() {
    println!("Hello, world!");
}
  • main 函数(也称为主函数)很特殊:它始终是每个可执行 Rust 程序中运行的第一个代码。
  • println! 调用 Rust 宏。如果改为调用函数,则应该将其输入为 println(不含 !)。当看到一个 !,则意味着调用的是宏而不是普通的函数。

Cargo.toml

[package]
name = "test_rust"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]

  • [package],是一个表块(section)标题,表明下面的语句用来配置一个包(package)。
  • edition:(Rust 的核心版本,即 2015、2018、2021 版等) 的值。
  • [dependencies] 是一个表块的开头,你可以在其中列出你的项目所依赖的任何包。在 Rust 中,代码包被称为 crate。

猜数字游戏v1: 获取用户输入

use std::io;
// io 库来自于标准库,标准库也被称为 std:

fn main() {
    println!("猜数字游戏!");
    println!("请输入你猜测的数字:");

    // 使用 let 语句来创建变量,在 Rust 中,变量默认是不可变的
    // 想要让变量可变,可以在变量名前添加 mut(mutability,可变性)
    // 等号(=)告诉 Rust 现在想将某个值绑定在变量上。等号的右边是 guess 所绑定的值,它是 String::new 的结果
    // 这个函数会返回一个 String 的新实例。String 是标准库提供的字符串类型,是一个 UTF-8 编码的可增长文本。
    // ::new 那一行的 :: 语法表明 new 是 String 类型的一个关联函数。
    // 关联函数(associated function)是实现一种特定类型的函数,在这个例子中类型是 String。
    //  new 函数创建了一个新的空字符串。你会在很多类型上找到一个 new 函数,因为它是创建类型实例的惯用函数名。
    // let mut guess = String::new(); 这一行创建了一个可变变量,目前它绑定到一个新的 String 空实例上
    let mut guess = String::new();

    // stdin 函数返回一个 std::io::Stdin 的实例,这是一个类型,代表终端标准输入的句柄。
    // .read_line(&mut guess) 这一行调用了 read_line 方法,来从标准输入句柄中获取用户输入。
    // 将 &mut guess 作为参数传递给 read_line(),以告诉它在哪个字符串存储用户输入。
    // read_line 的全部工作是,将用户在标准输入中输入的任何内容都追加到一个字符串中(而不会覆盖其内容),
    // 所以它需要字符串作为参数。这个字符串应是可变的,以便该方法可以更改其内容。
    // & 表示这个参数是一个引用(reference),这为你提供了一种方法,
    // 让代码的多个部分可以访问同一处数据,而无需在内存中多次拷贝。
    // 引用是一个复杂的特性,Rust 的一个主要优势就是安全而简单的使用引用。
    // 就像变量一样,引用默认是不可变的。因此,需要写成 &mut guess 来使其可变,而不是 &guess。
    // read_line 将用户输入存储到我们传递给它的字符串中,但它也返回一个值——在这个例子中是 io::Result。
    // Rust 标准库中有很多名为 Result 的类型:一个通用的 Result 以及在子模块中的特化版本,比如 io::Result。
    // Result 类型是 枚举(enumerations),通常也写作 enum。
    // 枚举类型持有固定集合的值,这些值被称为枚举的成员(variant)。
    // 枚举往往与条件表达式 match 一起使用,match 是一种条件语句,在其被执行时,可以方便地匹配不同枚举值来执行不同的代码。
    // Result 的成员是 Ok 和 Err,Ok 成员表示操作成功,且 Ok 内部包含成功生成的值。
    // Err 成员则意味着操作失败,并且包含失败的前因后果。
    // Result 类型的值,就像任何类型的值一样,都有为其定义的方法。
    // io::Result 的实例拥有 expect 方法。
    // 如果 io::Result 实例的值是 Err,expect 会导致程序崩溃,并显示传递给 expect 的参数。
    // 如果 read_line 方法返回 Err,则可能是底层操作系统引起的错误结果
    // 。如果 io::Result 实例的值是 Ok,expect 会获取 Ok 中的值并原样返回,以便你可以使用它。
    // 在本例中,这个值是用户输入的字节数。
    // 如果不调用 expect,程序也能编译,但会出现警告提示。
    // Rust 会警告我们没有使用 read_line 的返回值 Result,这表明程序没有处理一个可能发生的错误。
    // 消除警告的正确做法是实际编写错误处理代码
    // 在这个例子中,我们只希望程序在出现问题时立即崩溃,因此我们可以直接使用 expect。
    io::stdin()
        .read_line(&mut guess)
        .expect("Failed to read line");

    // 里面的 {} 是预留在特定位置的占位符:把 {} 想象成小蟹钳,可以夹住合适的值。
    println!("You guessed: {}", guess);
}

猜数字游戏v2: 生成随机数

// crate 是一个 Rust 代码包。我们正在构建的项目是一个 二进制 crate,它生成一个可执行文件
// rand crate 是一个 库 crate,库 crate 可以包含任意能被其他程序使用的代码,但是不能独自执行。
// 在我们使用 rand 编写代码之前,需要修改 Cargo.toml 文件,引入一个 rand 依赖。
// [dependencies] 表块标题之下添加 rand = "0.8.3"
// 0.8.3 实际上是 ^0.8.3 的简写,它表示任何至少包含 0.8.3 但低于 0.9.0 的版本
// 当我们引入了一个外部依赖后,Cargo 将从 registry 上获取所有依赖所需的最新版本,这是一份来自 Crates.io 的数据拷贝。
// Crates.io 是 Rust 生态环境中开发者们向他人贡献 Rust 开源项目的地方。
// 当你确实需要升级 crate 时,Cargo 提供了这样一个命令 update,它会忽略 Cargo.lock 文件,并计算出所有符合 Cargo.toml 声明的最新版本。
// cargo update 命令执行后,Cargo 默认只会寻找大于或等于 0.8.3 而小于 0.9.0 的版本。
// Rng 是一个 trait,它定义了随机数生成器应实现的方法
use rand::Rng;
use std::io;

fn main() {
    println!("猜数字游戏!");
    println!("请输入你猜测的数字:");

    // 调用 rand::thread_rng 函数来为我们提供将要使用的特定随机数生成器:
    // 它位于当前执行线程的本地环境中,并从操作系统获取 seed。
    // 然后我们调用随机数生成器的 gen_range 方法。该方法由我们刚才使用 use rand::Rng 语句引入的 Rng trait 定义。
    // gen_range 方法获得一个区间表达式(range expression)作为参数,并在区间内生成一个随机数。
    // 我们在这里使用的区间表达式采用的格式为 start..end。它包括起始端,但排除终止端。
    // 所以我们需要指定 1..101 生成一个 1 到 100 之间的数字。
    // 或者我们可以传入区间 1..=100,这和前面的表达等价。
    let secret_number = rand::thread_rng().gen_range(1..101);

    // 打印数字供测试用
    println!("The secret number is: {}", secret_number);
    let mut guess = String::new();


    io::stdin()
        .read_line(&mut guess)
        .expect("Failed to read line");

    println!("You guessed: {}", guess);
}

猜数字游戏v3: 比较猜测的数字和秘密数字

教程: https://rustwiki.org/zh-CN/book/ch02-00-guessing-game-tutorial.html

正文完
 
评论(没有评论)