Rust-01 启航
安装
所谓工欲善其事必先利其器,我们学习Rust当然需要安装Rust。我们可以从Rust官网下载rustup
工具进行rust的安装。安装完成后,我们在命令行中输入rustc --version
便可以查看我们所安装rust的版本。
笔者推荐在Windows平台使用PowerShell Core和Windows Terminal
Rust相关命令
安装好 rust 后,我们需要了解几个东西
rustc
rustc
是 rust 的编译器,负责将 rs 文件源码编译到可运行文件或者库的二进制代码
rustup
rustup
是 rust 的升级管理工具,负责升级 rust 的版本,常用命令rustup update
用来升级 rust
cargo
一般都不直接使用rustc
来直接编译 rs 文件,而是选择cargo
。 cargo
是 Rust 的包管理器,可以用来创建项目、安装依赖、类型检测、编译、运行以及测试项目等功能。cargo是一个功能强大的工具。
cargo run能够自动化调用
rustc` 对 rs 文件进行编译产出二进制文件并运行二进制文件。
常用cargo命令
命令 | 说明 | 示例 |
---|---|---|
cargo new | 创建项目,默认创建 binary 项目,添加参数可以选择 lib 和 bin 两种项目 | cargo new hello --lib(默认--bin) |
cargo check | 类型检测 | cargo check |
cargo build | 编译项目 | cargo build [--release] |
cargo run | 运行项目,可以带参数 | cargo run [--release] |
cargo test | 对项目进行单元测试 | cargo test |
详细的说明可以查看官方文档。
IDE
现在能够开发 rust 的工具已经有很多了,比如 Jetbrains 家的Clion(需要添加 rust 插件)或者 Microsoft家的VS Code(需要安装rust-analyzer扩展)
Hello World!
既然已经有了 rust 的运行环境,那么我们便开始创建第一个 rust 项目。使用cargo new hello-world
命令创建一个名为hello-world
的项目,然后cd hello-world
进入项目目录后可以看到项目的结构
C:.
│ .gitignore
│ Cargo.toml
│
└─src
main.rs
项目根路径会有一个Cargo.toml
和一个src\main.rs
,其中Cargo.toml
文件是负责配置 cargo 和项目依赖项,main.rs 文件则是程序的入口点,main.rs 里的代码
fn main() {
println!("Hello, world!");
}
简单易懂,关键字fn
用来声明这是一个无返回值名称为main
的 function,然后函数体内调用 rust 的输出宏println!
输出了Hello, world!
在 Rust 中所有的函数调用都是必须有返回值的表达式,无返回值的返回一个空的 tuple 表示或者省略不写。
fn foo() -> () {}
// 二者等效
fn foo() {}
我们运行cargo build
,对项目进行编译,默认情况下是生成带有 debug 信息并且没有优化的代码,可以得到下图所示内容
而添加--release
参数后,则会生成不带 debug 信息且优化后的代码,如下图所示(这一般是在正式发布时使用)
执行cargo build
命令后会在项目目录下生成一个 target 文件夹,target 文件夹中的内容就是编译生成的结果。根据cargo build
后面添加的参数会生成两个文件夹,即release
和debug
。
也可以直接运行cargo run
命令直接运行项目,这个命令就相当于cargo build && ./debug/hello-world.exe
先编译项目然后再执行编译后的可执行文件。和cargo build
一样默认是生成 debug 代码,带上--release
参数后则是 release 代码。
下图是cargo run
所显示信息
下图是cargo run --release
所显示信息
依赖项
在项目文件夹中找到Cargo.toml
文件,这个文件便是 Rust 项目的依赖项配置文件
在这个文件里对项目进行配置,比如我现在需要使用随机数,那么我只需要在
[dependencies]
下面添加rand = "0.8.3"
,然后项目运行时,cargo 会自己进行依赖还原,将详细的包写入Cargo.lock
文件中并且会自动去解析引入包的依赖,这和 npm 相似。
猜数字游戏
我们现在可以写一个小游戏来走一遍 Rust 项目创建到运行的流程
使用cargo new
创建一个新的项目,然后在Cargo.toml
文件中的[dependencies]
下面添加rand = "0.8.3"
打开main.rs
,并添加以下代码
use rand::Rng;
use std::cmp::Ordering;
use std::io;
fn guess() {
println!("Guess the number!");
let secret_number = rand::thread_rng().gen_range(1..101);
loop {
println!("Please input your guess.");
let mut buffer = String::new();
io::stdin()
.read_line(&mut buffer)
.expect("Failed to read line!");
let number: i32 = match buffer.trim().parse() {
Ok(num) => num,
Err(_) => continue,
};
match number.cmp(&secret_number) {
Ordering::Less => println!("Too small!"),
Ordering::Greater => println!("Too big!"),
Ordering::Equal => {
println!("You win!");
break;
}
}
}
}
fn main() {
guess();
}
这些代码也很容易理解。use std::io;
、use std::cmp::Ordering;
和use rand::Rng;
分别引入我们需要的模块。
std::io
用来获取输入的数字,std::cmp::Ordering
用来比较输入的数字和随机数的大小,rand::Rng
用来生成随机数。
然后我们声明了一个无参数和无返回值的函数 guess
。函数里主要是输出一行提示用户输入的提示信息和生成范围在[1,101)的随机整数,并根据用户输入的数字与随机数进行比较,直到用户猜测数字等于随机数字后结束程序。
我们需要处理用户的输入,在 rust 中使用io::stdin().read_line()
从标准输入流中获取用户的输入,因为read_line()
返回的是Result<usize>
,在 rust 中Result<T>
都可以使用 match(模式匹配)来对结果进行处理。loop
在 rust 中是开启一个无线循环,根据内部的 break 来跳出循环,这里我们根据用户输入的数字和产生的随机数字比较结果作为是否结束循环的条件。在 rust 中,我们需要着重的学习match
模式匹配,这里number.cmp
返回一个Ordering
,我们可以根据不同的结果进行不同处理,这和 if 条件判断类似,但是代码的可读性变高了,更利于理解,在 rust 中尽量使用模式匹配来进行逻辑判断以便减少 bug。main
函数就是简单地调用guess
函数。
使用cargo run
后,我们会得到以下信息
总结
至此,我们了解了 rust 的安装和各种命令以及创建并运行一个 rust 项目的所有流程。
引用
部分内容和代码参考Rust官网
Rust-01 启航的更多相关文章
- [译]Vulkan教程(01)入门
[译]Vulkan教程(01)入门 接下来我将翻译(https://vulkan-tutorial.com)上的Vulkan教程.这可能是我学习Vulkan的最好方式,但不是最理想的方式. 我会用“d ...
- rust语法
目录 rust语法 前言 一.数据类型 1.1 标量scalar 1.2 复合compound 1.3 切片slice 1.4 引用(借用)reference 1.5 智能指针smart pointe ...
- 用欧拉计划学Rust语言(第17~21题)
最近想学习Libra数字货币的MOVE语言,发现它是用Rust编写的,所以先补一下Rust的基础知识.学习了一段时间,发现Rust的学习曲线非常陡峭,不过仍有快速入门的办法. 学习任何一项技能最怕没有 ...
- 用欧拉计划学Rust语言(第7~12题)
最近想学习Libra数字货币的MOVE语言,发现它是用Rust编写的,所以先补一下Rust的基础知识.学习了一段时间,发现Rust的学习曲线非常陡峭,不过仍有快速入门的办法. 学习任何一项技能最怕没有 ...
- 01 . Redis简介及部署主从复制
简介 Remote Dictionary Server, 翻译为远程字典服务, Redis是一个完全开源的基于Key-Value的NoSQL存储系统,他是一个使用ANSIC语言编写的,遵守BSD协议, ...
- 第3课 - 启航Lua之路
第3课 - 启航Lua之路 1. Lua中的变量 (1)变量:全局变量和局部变量 — Lua中支持全局变量和局部变量的概念 全局变量:直接定义变量名,并复制 a = 1; -- 用 ; 结束当前语 ...
- Rust极简教程
目录 简介 特性 特征 用途 安装 核心组件 常用命令 基础语法 数据类型 标量类型 复合类型 示例 条件语句 循环 输出&输入 输出 输出花括号 输出非基础类型 输入 所有权 切片 结构体 ...
- 01.SQLServer性能优化之----强大的文件组----分盘存储
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 文章内容皆自己的理解,如有不足之处欢迎指正~谢谢 前天有学弟问逆天:“逆天,有没有一种方 ...
- 用Kotlin创建第一个Android项目(KAD 01)
原文标题:Create your first Android project using Kotlin (KAD 01) 作者:Antonio Leiva 时间:Nov 21, 2016 原文链接:h ...
- Java企业实训 - 01 - Java前奏
前言: 虽然个人专攻.NET方向,不过由于个人是干教育行业的,方方面面的东西,不能说都必须精通,但肯定多少都会涉及到. 一个菜鸟学员,从啥都不会,经过一步步学习,最后到企业上手掌管一个模块甚至一个项目 ...
随机推荐
- 4.MongoDB系列之索引(一)
1. 执行计划查看 db.getCollection('users').find({'username': 'shenjian'}).explain('executionStats') 结果查看,先大 ...
- 什么是齐博/齐博CMS之X1?
齐博x1:核心+模块+插件+钩子的理念把系统的灵活性及拓展性做到了极致!!!齐博X1是齐博软件基于thinkphp5开发的内容管理系统,拓展性非常强,后台一键升级,后台提供丰富的频道模块云市插件市场. ...
- 知识图谱顶会论文(KDD-2022) kgTransformer:复杂逻辑查询的预训练知识图谱Transformer
论文标题:Mask and Reason: Pre-Training Knowledge Graph Transformers for Complex Logical Queries 论文地址: ht ...
- 【MySQL】01_运算符、函数
运算符 运算符是保留字或主要用于 SQL 语句的 WHERE 子句 中的字符,用于执行操作,例如:比较和算术运算. 这些运算符用于指定 SQL 语句中的条件,并用作语句中多个条件的连词. 常见运算符有 ...
- DevOps | 如何快速提升团队软件开发成熟度,快速提升研发效能?
今天一个小伙伴问我,如何「快速提升」一个团队的软件开发成熟度?我犯难了.我个人理解一个团队的软件开发成熟度涉及的东西很多,但最简单最直接的方法就是发钱涨工资,可是估计很多公司不愿意,那就只有扣了. 快 ...
- 基于FPGA的SATA3.0主机控制器IP
SATA3.0 Host Controller IP SATA3.0 Host IP不仅实现了SATA协议的PHY(物理层).Link(链路层)和TRN(传输层),并且实现了CMD(命令层)和APP( ...
- MFC 学习笔记
MFC 学习笔记 一.MFC编程基础: 概述: 常用头文件: MFC控制台程序: MFC库程序: 规则库可以被各种程序所调用,扩展库只能被MFC程序调用. MFC窗口程序: 示例: MFC库中类的简介 ...
- threejs三维地图大屏项目分享
这是最近公司的一个项目.客户的需求是基于总公司和子公司的数据,开发一个数据展示大屏. 大屏两边都是一些图表展示数据,中间部分是一个三维中国地图,点击中国地图的某个省份,可以下钻到省份地图的展示. 地图 ...
- 如何快捷地修改虚拟机镜像——libguestfs-tools工具集介绍
前言 在使用云服务器产品时,由于问题修复.功能添加.软件更新等原因,往往需要对已有系统镜像进行二次修改. 这种情况下,最为简单的做法是:使用原镜像创建实例,在实例中进行修改,修改完毕后再转镜像.这种做 ...
- Vue2 到 Vue3,重温这 5 个常用的 API
距离Vue3发布已经过去一年多时间了,从Vue2到Vue3是一个不小的升级,包括周边生态等.虽然目前大多数开发者们在使用的仍旧以Vue2为准,但Vue3显然是Vue开发者们未来必须面对的,而且前不久V ...