Day 01 - 基础 rust

本贴最后更新于 365 天前,其中的信息可能已经时过境迁

image

变量重影

  • 使用 : + 类型 可以 申明变量的类型。

fn main() {
    let random: i64 = 20; 
    let random = "我是刘博源"; // 重影变量  
    println!("{}", random);
}

当一个变量可以进行重影(相当于重新申明 重新绑定一个新的变量) 类似于这样的:

int a = 2;
String a  = "213";

mut 与 重影 的区别是什么?

Rust 中 变量默认是不可变的 需要加上 mut 才可以变成可变变量

let mut number = 1;
let number2 = 2; 
number2 = 3; // 报错 因为 number2 不是可变变量
let number2 = 4; // 不报错  因为number2这里不是修改变量而是重影变量
number = 1324; // number1随便修改 都不会报错(但是你得注意类型)
number = " asdhi o" // 报错 因为类型不对
let mut number = "asdajsghd" // 不报错 因为类型虽然不对 但这是重影

数据类型

基础的有 整型(i8 i16 i32 i64 i128 isize)不同进制的整型 浮点型 布尔型 字符型 复合类型

复合类型

fn main() {
    let mut tup = (2, 4, "123123", 123.4);
    tup.0 = 3;
    print!("{}", tup.0);
}

复合类型 可以存在多个变量类型 并放在一个()中类似我们的元组,但是不同的是他不是用 a[i] 进行索引 而是 a.i 进行索引

列表类型

fn main() {
    // let mut lst = [2, 4, 5, 6, 7, "2312"]; // 错误:不能存在多个不同类型的变量
    // lst[2] = "123"; // 错误:不能对lst固有的类型进行修改!

    let mut lst = [1,4,5,6];
    lst[2] = 4;
    print!("{}", lst[2]);
}

这是打印的方式 [2;5] 表示列表长度为 5 里面全是 2

fn main() {
    let mut lst = [2; 5];
    print!("{:?}", lst);
}
// [2, 2, 2, 2, 2]

函数

fn add(number1: i64, number2: i64) -> i64 { // 形参 返回值 必须声明类型!
    return number1 + number2;
}

fn main() {
    let _number1: i64 = 2;
    let _number2: i64 = 5;
    println!("{}", add(_number1, _number2));
}

函数表达式

fn main() {
    let _number1: i64 = 2;
    let _number2: i64 = 5;
    let _add : i64 = {
        let tmp = _number2 + 3;
        _number1 + tmp //这里不能有分号 有分号的是语句 语句的返回值是()!
    }; // 此刻 _add = _number1 + tmp
    println!("{}", _add);
    //println!("{}", tmp); // 拿不到局部的值
}

流程控制

if

if 语句:

fn main(){
    let a = -4;
    if a > 0{
        print!("是正数");
    }else {
        println!("是非正数");
    }
}

if 语句后面只能是 Bool 类型的变量。

当然我们还有类似的三元运算符:

fn main() {
    let a = 0;
    let b = if a > 0 { "是正数" } else if a == 0 { "是0" } else { "是负数" };

    if a > 0 {
        print!("是正数");
    } else {
        println!("是非正数");
    }

    print!("{}", b);
}

loop

fn main() {
    let mut number = 0;
    loop {
        print!("{}\n", number);
        number += 1;
        if number == 10000{
            break;
        }
    }
}

loop 是死循环的一种 直到他 break 之前会不断的执行

我们可以给 Rust 的 loop 设置一个循环标签:

fn main() {
    let mut number = 0;
    'Home: loop {
        print!("{}\n", number);
        number += 1;
        if number == 3 {
            let mut number2 = 5;
            'inner: loop {
                let mut ret: i32 = number + number2;
                print!("- {}\n", ret);
                number2 += 1;
                if ret > 5 {
                    break 'inner;
                }
            }
        }
        if number > 4 {
            break 'Home;
        }
    }
    print!("{}",number);
}

for

首先 for 可以用来简单的遍历

fn main() {
    let mut numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
    for i in numbers {
        print!("{}\n", i);
    }
}

指定范围的遍历

fn main() {
    let mut  nums = 1..101;  // 从一到一百 包前不包后
    println!("{:?}", nums); // 1..101
    for i in nums{
        print!("{}\n", i); // 1 // 2 // 3 .... //100
    }
}

我们可以对范围类型的遍历进行倒置

fn main() {
    let mut  nums = 1..101;
    println!("{:?}", nums);
    for i in nums.rev() {
        print!("{}\n", i);
    }
}

随机数游戏

我们先写一个可以进行输入的代码:

use std::io; // 加入io库 std 是一个标准库 

fn main() {
    println!("猜数游戏"); // 加入提示
    let mut val = String::new(); // 创建一个新的字符串 但是字符串是空的
    println!("请写入一个数字: ");

    io::stdin().read_line(&mut val).expect("错误!"); // 等待用户进行输入 并将 val的引用交给read_line read_line然后在进行对val的修改
    print!("你输入的数字是: {val}");
}

use 会预导入一个 prelude 库 除此之外我们需要显式的导入比如 use std::io;

引用默认也是不可变的 所以我们传入 read_line 的时候不是 read_line(&val) 而是 read_line(&mut val)

依赖添加

我们要知道 rust 默认本身是很轻便的需要三方库的支持 如何支持三方库? 使用 Cargo 的 toml 就可以了比如我们添加一个随机数的库

[dependencies]
rand = "0.8.5"

然后我们进行 cargo build 就可以了 。(有 idea 就不管~)

然后我们就可以在代码中创建一个随机数了

use std::io;
use rand::Rng;

fn main() {
    println!("猜数游戏");
    let mut val  = String::new();
    println!("请写入一个数字: ");
    let rand_num = rand::thread_rng().gen_range(1..101);
    io::stdin().read_line(&mut val).expect("错误!");
    print!("你输入的数字是: {val} 我猜的数字是{rand_num}");
}

Ordering 是 std cmp 提供的一个枚举 表示两个对象的大小 有 Less 小于 Greater 大于 Equal 等于

然后我们的字符串类型有个 cmp 方法可以比较 self 和参数引用变量的大小,他会返回 Ordering 类型的枚举。

接着还有就是 match 表达式, match 表达式的使用方法是:

match (...){
	A => xxx,
	B => xxxx,
}

当括号里的值与 A B 这些值匹配的时候就会后面的代码 AB 这些值我们称之为 ARM 一个 Match 存在多个 ARM

use rand::Rng;
use std::cmp::Ordering;
use std::io;

fn main() {
    println!("猜数游戏");
    let mut val = String::new();
    println!("请写入一个数字: ");
    let rand_num = rand::thread_rng().gen_range(1..101);
    io::stdin().read_line(&mut val).expect("错误!");
    print!("你输入的数字是: {val} 我猜的数字是{rand_num}");
    let val: u32 = val.trim().parse().expect("请输入一个可以被转换成int的数字!");
    match val.cmp(&rand_num) {
        Ordering::Less => print!("太小了"),
        Ordering::Greater => print!("太大了"),
        Ordering::Equal => print!("You Are Win"),
    }
}

trim 是去除字符串两端的空白

parse 是将字符串强制转化类型的数字类型

然后我们可以使用之前的流控语句进行更新:

use rand::Rng;
use std::cmp::Ordering;
use std::io;

fn main() {
    println!("猜数游戏");
    let rand_num = rand::thread_rng().gen_range(1..101);

    'guess_block: loop {
        println!("请写入一个数字: ");
        let mut val = String::new();
        io::stdin().read_line(&mut val).expect("错误!");
        print!("你输入的数字是: {val} 我猜的数字是{rand_num}");
        let val: u32 = val.trim().parse().expect("请输入一个可以被转换成int的数字!");
        match val.cmp(&rand_num) {
            Ordering::Less => print!("太小了"),
            Ordering::Greater => print!("太大了"),
            Ordering::Equal => {
                print!("You Are Win");
                break 'guess_block;
            }
        }
    }
}

我们还需呀知道 parse 这种方法会返回一个 Result 类型的枚举 有成功的 Ok 和失败的 Err, 其中 ok 有携带了一个 num 表示 parse 处理后返回数字

use rand::Rng;
use std::cmp::Ordering;
use std::io;

fn main() {
    println!("猜数游戏");

    let rand_num = rand::thread_rng().gen_range(1..101);

    'guess_block: loop {
        println!("请写入一个数字: ");
        let mut val = String::new();
        io::stdin().read_line(&mut val).expect("错误!");
        print!("你输入的数字是: {val} 我猜的数字是{rand_num}");

        let val: u32 = match val.trim().parse() {
            Result::Ok(num) => num,
            Result::Err(_) => {
                print!("你输入的变量不对!");
                continue;
            }
        };

        match val.cmp(&rand_num) {
            Ordering::Less => print!("太小了"),
            Ordering::Greater => print!("太大了"),
            Ordering::Equal => {
                print!("You Are Win");
                break 'guess_block;
            }
        }
    }
}

  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    57 引用 • 22 回帖
2 操作
KuMa 在 2023-03-29 17:49:08 更新了该帖
KuMa 在 2023-03-29 03:09:33 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...