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]依赖安装的包
rust 复制代码
[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

相关推荐
幸运小圣14 小时前
Vue3 -- 项目配置之stylelint【企业级项目配置保姆级教程3】
开发语言·后端·rust
老猿讲编程16 小时前
Rust编写的贪吃蛇小游戏源代码解读
开发语言·后端·rust
yezipi耶不耶1 天前
Rust 所有权机制
开发语言·后端·rust
喜欢打篮球的普通人1 天前
rust并发
rust
大鲤余1 天前
Rust开发一个命令行工具(一,简单版持续更新)
开发语言·后端·rust
梦想画家1 天前
快速学习Serde包实现rust对象序列化
开发语言·rust·序列化
数据智能老司机1 天前
Rust原子和锁——Rust 并发基础
性能优化·rust·编程语言
喜欢打篮球的普通人1 天前
Rust面向对象特性
开发语言·windows·rust
上趣工作室1 天前
uniapp中使用全局样式文件引入的三种方式
开发语言·rust·uni-app
许野平1 天前
Rust:GUI 开源框架
开发语言·后端·rust·gui