Rust修仙笔记下境界-炼气期

rust是一门静态类型语言,内存高效,速度快,在命令行webAssembly,网络服务,嵌入式,web3方向有广泛应用,以下是一篇rust入门笔记。

开始学习rust的第一步

rust安装

  • 安装rust环境,具体参考官方install教程rust-lang
bash 复制代码
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
  • 安装完成后开始第一个hello rust
bash 复制代码
cargo new 01-hello-rust --name hello-rust

当我们在终端执行以上命令后,就会生成下面几个文件

当我们在项目根目录执行cargo run,此时就运行了rust写的第一个项目了,并打印出了了main.rs文件

rust 复制代码
fn main() {
    println!("Hello, rust!");
}

我们的终端运行命令后

rust 复制代码
Finished dev [unoptimized + debuginfo] target(s) in 0.03s
 hellRunning `target/debug/hello-rust`
Hello, rust!

我们注意到在基础项目里有一个Cargo.toml的文件,这是在rust工程文件使用cargo创建项目后生成的文件,其中有默认的几个参数

  • name 该项目的名称
  • version 版本号
  • edition 为年份
  • dependencies\]依赖安装的包

[package]
name = "hello-rust"
version = "0.1.0"
edition = "2021"

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

[dependencies]

复制代码
当你使用`cargo run`时,此时`src`目录下除了原有的`main.rs`文件,也会多生成一个可执行`main.exe`文件

### 猜数游戏

首先我们使用`cargo`创建一个项目

```rust
cargo new guess-game

我们具体看下代码

rust 复制代码
use rand::Rng;
use std::io;

fn main() {
    println!("猜数字游戏");
    println!("请输入一个1到100之间的数字");
    // 用let定义了一个不可变的变量
    let secret_number = rand::thread_rng().gen_range(1..=100);
    // rust中的循环使用loop关键词
    loop {
        // 申明一个可变的变量,且为字符串类型存储输入值
        let mut input = String::new();
        // 使用io读取输入的值
        io::stdin()
            .read_line(&mut input) // 这里引用的上面同一个input的值
            .expect("failed to read line"); // 防止系统报错
         // 将输入的字符串变为数字
        let input: u32 = input.trim().parse().expect("Please type a number!");

        // 比较输入值与随机数的大小,这里使用match 关键词,&secret_number是一个形参
        match input.cmp(&secret_number) {
            // 使用Ordering的枚举
            std::cmp::Ordering::Less => println!("太小了!"),
            std::cmp::Ordering::Greater => println!("太大了!"),
            std::cmp::Ordering::Equal => {
                println!("恭喜你,猜对了!");
                break; // 中指退出loop循环
            }
        }
    }
}

至此我们一个猜数字的程序就已经写好了,看代码似乎还有很多疑问。

  • 首先我们在使用随机数时,主要是由于我们引入了use rand::Rng,在我们使用这个1-100随机数时,是直接使用定义了一个不可变量screct_number,rand::thread_rng().gen_range(1..=100)

在使用rand时,我们必须在Cargo.toml[dependencies]写入rand = "0.8.5",当我们首次运行时,就会安装rand相关的包

  • 我们在读取用户输入值时,我们使用了use std::io,在读取用户输入的值,我们使用io::stdin().read_line(&mut input)

  • 我们多次使用的input这个变量,在rust中是允许同一个变量名被定义多次的,最近的一次引用取最近的一次定义

比如下面

rust 复制代码
fn main() {
  let name = 'Web技术学苑';
  println!("{}", name); // Web技术学苑
  let name = "Maic";
   println!("{}", name); // Maic
}
  • 当我们使用循环时,我们使用了loop,使用{}代码块包裹

  • 在使用match时,match input.cmp($screct_number),并且接着代码块是非常奇怪的语法

rust 复制代码
match input.cmp($screct_number) {
  std::cmp::Ordering:Less => println!("太小了"),
  std::cmp::Ordering:Greater => println!("太大了"),
  std::cmp::Ordering:Equal => {
     println!("恭喜你,猜对了");
     break; // 中断loop循环
  }
}

Ordering:Less是引入的枚举,至于为啥这么写,还是需要慢慢适应 $screct_number是一个不可变的形参

println!

关于打印,我们在项目中主要是为了方便调试的,在rust中打印俗称

  • {}是占位符,可以{a}中的a是最近定义的变量
  • {0}{1}表示获取参数的第一个值与而个值
  • 可以定义{name}中的参数名
rust 复制代码
fn main() {
 // 输出后会换行
  println!("Hello, world!");
  // 不会换行
  // print!("hello i is print");

  // {},{}会一一占位hello world
  println!("{} {}", "hello", "world");

  // 0 hello 1 world
  println!("{0} {1} {0}", "a", "b");

  // 命名参数
  println!(
      "{name} likes to play {activity}",
      name = "John",
      activity = "Baseball"
  );
  // 输出的结果是:000001
  println!("{number:>0width$}", number = 1, width = 6);
}

总结

  • 如何安装rust,以最基础的例子hello rust入门rust

  • 猜数字游戏了解rust,我们使用stdrand这两个库实现了输入数字猜数游戏

  • 猜数字游戏中我们学习了解到如何定义可变变量与不可变量,以及如何使用循环,字符串转数字,以及使用Ordering枚举,中断循环等

  • 了解println!通用的打印,通常{}是一个变量占位符

  • code example

相关推荐
Tony Bai2 小时前
Rust 看了流泪,AI 看了沉默:扒开 Go 泛型最让你抓狂的“残疾”类型推断
开发语言·人工智能·后端·golang·rust
jump_jump3 小时前
RTK:给 AI 编码助手瘦身的 Rust 代理
性能优化·rust·claude
小杍随笔8 小时前
【Rust Exercism 练习详解:Anagram + Space Age + Sublist(附完整代码与深度解读)】
开发语言·rust·c#
Rust研习社10 小时前
Rust 字符串与切片实战
rust
朝阳58110 小时前
局域网聊天工具
javascript·rust
朝阳58110 小时前
我做了一个局域网传文件的小工具,记录一下
javascript·rust
Rust语言中文社区1 天前
【Rust日报】用 Rust 重写的 Turso 是一个更好的 SQLite 吗?
开发语言·数据库·后端·rust·sqlite
小杍随笔1 天前
【Rust 半小时速成(2024 Edition 更新版)】
开发语言·后端·rust
Source.Liu1 天前
【office2pdf】office2pdf 纯 Rust 实现的 Office 转 PDF 库
rust·pdf·office2pdf
洛依尘1 天前
深入浅出 Rust 生命周期:它不是语法负担,而是借用关系的说明书
后端·rust