Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Rust修仙笔记之炼气期

Rust修仙笔记之炼气期

作者头像
Maic
发布于 2024-01-26 11:50:59
发布于 2024-01-26 11:50:59
11000
代码可运行
举报
文章被收录于专栏:Web技术学苑Web技术学苑
运行总次数:0
代码可运行
rust是一门静态类型语言,内存高效,速度快,在命令行webAssembly,网络服务,嵌入式,web3方向有广泛应用,以下是一篇rust入门笔记。

rust安装

  • 安装rust环境,具体参考官方install教程rust-lang[1]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
  • 安装完成后开始第一个hello rust
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
cargo new 01-hello-rust --name hello-rust

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
fn main() {
    println!("Hello, rust!");
}

我们的终端运行命令后

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
Finished dev [unoptimized + debuginfo] target(s) in 0.03s
 hellRunning `target/debug/hello-rust`
Hello, rust!

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

  • name 该项目的名称
  • version 版本号
  • edition 为年份
  • [dependencies]依赖安装的包
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
[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创建一个项目

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
cargo new guess-game

我们具体看下代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
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中是允许同一个变量名被定义多次的,最近的一次引用取最近的一次定义

比如下面

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
fn main() {
  let name = 'Web技术学苑';
  println!("{}", name); // Web技术学苑
  let name = "Maic";
   println!("{}", name); // Maic
}
  • 当我们使用循环时,我们使用了loop,使用{}代码块包裹
  • 在使用match时,match input.cmp($screct_number),并且接着代码块是非常奇怪的语法
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
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}中的参数名
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
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[2]

参考资料

[1]rust-lang: https://www.rust-lang.org/tools/install

[2]code example: https://github.com/maicFir/lessonNote/blob/master/rust/guess-game/src/main.rs

最后,看完觉得有收获的,点个赞,在看,转发,收藏等于学会,原创不易,欢迎关注Web技术学苑,好好学习,天天向上!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-01-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Web技术学苑 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Rust学习】02_猜谜游戏
让我们一起动手完成一个项目,来快速上手 Rust!本章将介绍 Rust 中一些常用概念,并向您展示如何在实际项目中运用它们。您将会学到 let、match、方法、关联函数、引用外部 crate 等知识!后续章节会深入探讨这些概念的细节。
思索
2024/06/26
1090
【Rust学习】02_猜谜游戏
猜数游戏-Rust版
fliter
2023/09/05
1530
猜数游戏-Rust版
Rust学习笔记(2)- Cargo包管理器
在rust中,使用cargo工具来进行包的管理,和第一章的例子不同,如果要使用cargo进行包管理,需要使用cargo命令来创建项目:
TestOps
2022/04/07
9140
Rust学习笔记:2.1-2.3 猜数游戏
库的地址: https://crates.io/crates/rand 在 Cargo.toml 文件下的 [dependencies] 中添加依赖:
DioxideCN
2022/08/05
4870
rust 入门笔记:环境安装、hello World、Cargo
github地址:https://github.com/yunwei37/os-summer-of-code-daily
云微
2023/02/24
7620
Rust学习入门
高性能,内存利用率高,没有运行时和垃圾回收 可靠 , 丰富的类型系统和所有权模型保证内存和线程安全,编译器可以消除各种错误 生产力, 包管理器、构建工具一流, 多编辑器支持自动补齐和格式化代码
awwewwbbb
2022/10/05
3480
Rust流程控制
语句在英文中是 statement,表达式则是 expression。我们可能常常听说过“赋值语句”或者“算数表达式”这些名词,但是你有想过为什么不是“赋值表达式”吗?语句和表达式有一个重要的区别在于,表达式总是返回一个值,而语句不会。例如:
端碗吹水
2022/06/01
5640
Rust修仙笔记结丹期
在方法后面使用通用类型T,比如fn foo<T: Display>(arg:T){}
Maic
2024/06/17
1040
Rust修仙笔记结丹期
开箱体验Rust,Come on!!!
Dear,大家好,我是“前端小鑫同学”,😇长期从事前端开发,安卓开发,热衷技术,在编程路上越走越远~ 最近在看一下桌面端应用的开发,在看了一些Electron的使用后又了解到了一个更加新颖的Tauri的框架,它在内部使用到了Rust,同时发现最近的一些培训机构也在跟风推Rust的一些引流课程,所以还是需要了解和学习一下Rust的入门知识好支持后续学习Tauri。 快速配置环境(Win11,64位): 安装 Microsoft C++ 生成工具:下载后双击安装即可,注意安装后需要重启电脑和安装版本建议2
前端小鑫同学
2022/12/26
4130
开箱体验Rust,Come on!!!
《Rust Programming Language》- 05 - Packages, Crates And Modules
A crate is the smallest amount of code that the Rust compiler considers at a time.
szhshp
2023/01/05
2730
Rust修仙笔记之筑基期
如果我想让一个申明的变量可变,只需用mut修饰即可,注意我们右侧的变量用双引号,不能用单引号。
Maic
2024/02/29
1020
Rust修仙笔记之筑基期
编程语言新宠 Rust 不完全入门指南
学习 Rust 之前,在知乎等平台也看到过一些回答,认为 Rust 学习曲线陡峭、难学,个人觉得如果有些 C/C++ 的基础其实学起来也还好,只不过 Rust 有很多独有的概念,这一点是和现有很多主流语言是不同的,需要花点时间看下。
五月君
2021/03/16
2.8K0
编程语言新宠 Rust 不完全入门指南
Rust学习笔记之包、Crate和模块
今天,我们继续「Rust学习笔记」的探索。我们来谈谈关于「包、Crate和模块」的相关知识点。
前端柒八九
2023/03/23
9630
Rust学习笔记之包、Crate和模块
Rust中使用模块组织代码
自上个世纪 90 年代以来,软件工程的复杂性越来越高,程序渐渐从一个人的独狼开发转为多人团队协作开发。在今天,通过 Github 或中心化的代码分发网站,我们可以轻松的在一个软件工程中同时引入世界各地的开发者开发的代码,我们与同事在同一个工程目录下并行开发不同的程序功能,或者在不拷贝代码的前提下将一个工程中的代码在另一个工程中复用。这一切都是因为模块化编程。
端碗吹水
2022/06/01
5800
【Rust学习】03_常用编程概念
本章介绍了几乎所有编程语言中出现的概念以及它们在 Rust 中的工作方式。许多编程语言的核心有很多共同点。本章中介绍的概念都不是 Rust 独有的,但我们将在 Rust 的背景中讨论它们,并解释使用这些概念的约定。
思索
2024/07/12
2110
【Rust学习】03_常用编程概念
Rust实战系列-复合数据类型
本文是《Rust in action》学习总结系列的第三部分,更多内容请看已发布文章:
abin
2023/03/21
1.5K0
Rust实战系列-复合数据类型
Rust使用gRPC
需要先安装protoc(Protocol Buffers Compiler),可据此Protobuf Compiler Installation[1]下载
fliter
2024/01/09
2470
Rust使用gRPC
rust变量与常量
在rust里有个核心原则,那就是所有权。在其它语言中,我们可以把一个值赋值给变量。但是在rust里,是把值绑定到变量上。任何内存对象都是有主人的,而且一般情况下完全属于它的主人,绑定就是把这块内存绑定给一个变量,让这个变量成为它的主人。
zy010101
2022/11/28
5260
rust变量与常量
一网打尽 Rust 语法
大家好,我是「柒八九」。一个「专注于前端开发技术/Rust及AI应用知识分享」的Coder
前端柒八九
2024/04/30
1590
一网打尽 Rust 语法
【Rust学习】22_panic!或者Result
那么,我们该如何判断何时应当使用 panic! 宏,何时应当返回 Result 类型呢?当代码触发 panic! 时,它意味着程序将无法恢复。你可以认为 panic! 适用于那些你认为无法或无需恢复的错误情况,即你已经确定这个错误是不可恢复的。而当你选择返回 Result 类型时,你实际上是在给调用者提供选择权。调用者可以根据具体情况决定是尝试某种恢复策略,还是认为这个 Err 值代表了一个不可恢复的错误,进而选择调用 panic!,将原本可能恢复的错误转变为不可恢复的错误。因此,在定义可能失败的函数时,默认返回 Result 类型是一个较好的选择。
思索
2025/01/08
790
【Rust学习】22_panic!或者Result
相关推荐
【Rust学习】02_猜谜游戏
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验