# 安装 rust

官网安装

# mac 系统安装
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# 常用命令

# 更新
rustup update
# 卸载
rustup self uninstall
# 安装验证,rustc x.y.z (commit_hash yyyy-mm-dd)
rustc --version
# 本地文档
rustup doc

# 开发工具

vscode,插件:rust-analyzer、另外一个 rust 插件已经弃用了

# hello world

  1. 文件后缀: .rs
  2. 命名规范:hello_world.rs
fn main() {
    println!("Hello World!");
}

# 编译和运行

  1. 编译:rustc 文件名.rs
  2. 生成 .exe 可执行文件和 .pdb 调试文件
  3. rust 是 ahead-of-time 编译语言:不需要安装 rust 就可以运行执行文件
  4. rustc 适合编译简单的程序

# cargo

  1. cargo 是 rust 构建系统和包管理工具
  2. 查看是否安装:cargo --version
# 查看是否安装、版本号
cargo --version
# 创建新项目
cargo new 项目名称
# cargo new hello_world
# --vcs 指定版本控制系统:默认 git; hg, pijul, or fossil, none

# cargo.toml 介绍

[package]

  • name: 项目名称
  • version: 项目版本
  • authors: 项目作者
  • edition: rust 版本

[dependencies]
rust 里面,代码的包称作 crate

# cargo 构建和运行项目

  • cargo build: 编译
  • cargo run: 编译和运行

# cargo check 检查代码

  1. 检查代码,确保能通过编译,但是不产生可执行文件
  2. 比 build 快的多,编写代码可以连续反复 cargo check 检查代码,提供效率

# 为发布构建

cargo build --release

  1. 编译时会进行优化:编译时间久,代码运行快
  2. 会在 target/release 目录生成,而不是 target/debug

# 猜一个数:一次猜测

//prelude 没在预导入里面的,需要手工引入 use
use std::io; // prelude
fn main() {
    println!("猜数:");
    println!("猜一个数(1-100):");
    // 1. 所有变量默认 immutable,如果要修改,则需要用 mut
    // 2. 返回一个 String 对象实例,:: 关联函数
    let mut guess = String::new();
    // 1. stdin 关联函数返回一个 Stdin 的实例
    // 2. 引入默认也是不可变的,因此也需要 mut
    // 3. read_line 返回 io::Result 枚举类型:Ok, Err
    io::stdin().read_line(&mut guess).expect("读取错误!");
    // {} 占位符
    println!("你猜的数是: {}", guess);
}

# 猜一个数:生成神秘数字

我们创建的项目是二进制 crate(可以独立运行);我们要引用一个依赖,这个是依赖 crate(不能独立运行)。

在 dependencies 下添加
rand = "0.3.14"

# Cargo.lock

cargo.lock 锁定当前依赖版本,保证每次编译生成相同东西,保证一致性;
如果修改依赖版本,则可以 cargo update 更新这个文件

cargo update

# 生成神秘数字

// 这是一个 trait,类似接口;rand::thread_rng () 需要
use rand::Rng; // trait
use std::io;
fn main() {
    println!("猜数:");
    let secret_number = rand::thread_rng().gen_range(1..101);
    println!("神秘数字: {}", secret_number);
    println!("猜一个数(1-100):");
    let mut guess = String::new();
    io::stdin().read_line(&mut guess).expect("读取错误!");
    println!("你猜的数是: {}", guess);
}

# 猜一个数:比较猜测数字和神秘数字

// 这是一个 trait,类似接口;rand::thread_rng () 需要
use rand::Rng; // trait
use std::cmp::Ordering;
use std::io;
fn main() {
    println!("猜数:");
    let secret_number = rand::thread_rng().gen_range(1..101);
    println!("神秘数字: {}", secret_number);
    println!("猜一个数(1-100):");
    let mut guess = String::new();
    io::stdin().read_line(&mut guess).expect("读取错误!");
    println!("你猜的数是: {}", guess);
    // 1. parse 后,需要指定类型,这里指定 u32;expect 就是异常中断程序处理
    // 2. 原本 secret_number 默认是 i32 类型;
    //    因为后面 guess.cmp 与 secret_number 比较,
    //    编译器自动推断 secret_number 类型也为 u32
    let guess: u32 = guess.trim().parse().expect("Please input a number!");
    //match 匹配,每个分支称为 arm
    match guess.cmp(&secret_number) {
        Ordering::Less => println!("Too small!"),
        Ordering::Greater => println!("Too Big!"),
        Ordering::Equal => println!("You win!"),
    }
}

# 猜一个数:多次猜测

use rand::Rng;
use std::cmp::Ordering;
use std::io;
fn main() {
    println!("猜数:");
    let secret_number = rand::thread_rng().gen_range(1..101);
    println!("猜一个数(1-100):");
    // 多次循环
    loop {
        let mut guess = String::new();
        io::stdin().read_line(&mut guess).expect("读取错误!");
        println!("你猜的数是: {}", guess);
        //expect 导致程序中断,不优雅,因此用 match 处理不同枚举情况
        let guess: u32 = match guess.trim().parse() {
            // 直接返回结果
            Ok(num) => num,
            // 不关心结果,用 _ 表现
            Err(_) => {
                println!("请输入一个数字.");
                // 跳出此次循环,但不停止循环
                continue;
            }
        };
        match guess.cmp(&secret_number) {
            Ordering::Less => println!("Too small!"),
            Ordering::Greater => println!("Too Big!"),
            Ordering::Equal => {
                println!("You win!");
                // 跳出并且停止此循环
                break;
            }
        }
    }
}
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Cecil 微信支付

微信支付

Cecil 支付宝

支付宝

Cecil PayPal

PayPal