Rust快速学习入门(第一节)
目录
4.1 变量的可变与不可变(mutable/imutable)
4.5 控制逻辑(if-else、loop/while/for)
0.背景
据说Rust要引入到Linux源码中,和C一起来做Linux的源码开发,所以凑个热闹,一起看了一下,本文仅作为入门了解,不作为专业介绍,详细专业介绍请参照官网介绍:Rust Programming Language
Rust是一种静态编译型语言,和C类似,简单的理解就是它能做Linux操作系统,应该是挺NB的,具体应用场景,Rust官网首页中有明确介绍
- 命令行应用(CLI)
- WebAssembly(WebAssembly | MDN)
- 网络服务(Network)
- 嵌入式(Embeded)
1. Hello World
免安装在线体验Hello World,入口:Rust Playground,输入以下代码:
fn main() {
println!("Hellow Rust World! ");
}

2. 安装
到这里下载相应的安装文件就可以了:入门 - Rust 程序设计语言
安装完成后,进入命令行,输入以下命令,这个是编译Rust用的,将rust源码编译成可执行程序,在windows中就是exe的文件:
rustc --version
结果

说明安装成功,但其官方推荐的是使用cargo的管理工具,给我的理解cargo与Rust的关系,有点类似npm与js的关系:
3. 实战(猜数游戏)
我们用cargo创建一个猜数字游戏的命令行应用程序:
cargo new guessnumber
找到src目录下的main.rs文件,输入如下代码

use rand::prelude::*;
use std::cmp::Ordering;
use std::io;
fn main() {
let mut rng = thread_rng();
let secret_number = rng.gen_range(1..100);
println!("系统已经生成了一个1-100之间的神秘数字,请猜一下:");
let mut icount = 0;
loop {
icount = icount + 1;
let mut guess = String::new();
io::stdin()
.read_line(&mut guess)
.expect("没读到您输入的数字!");
let guess: u32 = match guess.trim().parse(){
Ok(num) => num,
Err(_) => continue,
};//.expect("请输入一个数字!");
match guess.cmp(&secret_number) {
Ordering::Less => print!("小了!"),
Ordering::Greater => print!("大了!"),
Ordering::Equal => {
println!("NB,猜对了!");
break;
}
}
println!("再猜一下:");
}
println!("一共猜了{}次就猜到了,神秘数字:{}", icount, secret_number);
}
编译并运行
cargo run
报错了:

说明缺少依赖包,我们在配置文件(Cargo.toml)里加入依赖:
[dependencies]
rand = "0.8.0"

加入后,我们重新运行 cargo run,加入依赖后,会先下载相关依赖,再进行编译运行,所以这里运行有点慢,这个要稍等一下,具体与你的网络有关。(也可参照以下地址配置,选择使用国内镜像:Rust crates 国内镜像源加速配置 - 知乎)

如何快速猜出这个数字,作为一个专业的程序员,我们可采用2分法来快速定位这个数字是什么,一般来说不出意外的话,6次就可以猜到了:

再运行一次:
PS C:\Users\gear1\rust\guessnumber> cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.05s
Running `target\debug\guessnumber.exe`
系统已经生成了一个1-100之间的神秘数字,请猜一下:
50
小了!再猜一下:
75
大了!再猜一下:
63
大了!再猜一下:
56
小了!再猜一下:
59
小了!再猜一下:
61
NB,猜对了!
一共猜了6次就猜到了,神秘数字:61
PS C:\Users\gear1\rust\guessnumber>
这样就真正完成了第一个“实用”的程序
4. 基本概念
4.1 变量的可变与不可变(mutable/imutable)
变量声明,使用let关键字即可,注意变量默认是不可变的,相当于给定了值就是这个值了,如下图所示
fn main() {
let x = 5;
println!("The value of x is: {}", x);
x = 6; //这里会报错,默认变量是不可变的
println!("The value of x is: {}", x);
}

如何不出错? 使用mut关键字
fn main() {
let mut x = 5;
println!("The value of x is: {}", x);
x = 6;
println!("The value of x is: {}", x);
}

4.2 常量与变量
常量的声明使用const关键字,与变量有什么区别,看个例子:
const MAX_HUMAN_HEIGHT: u32 = 300;
这个是假设定义一个人最大高度的常量为300cm,如果使用变量定义
let max_human_height = 300;
看到区别了吧,常量定义是要指定数据类型的,而变量定义是不需要指定类型的。

4.3 Shadow(影子变量)
看例子,下面的代码中对于变量x进行多次的声明,并且新的声明中使用了上次的声明,其实这个也比较容易理解,每次使用let定义变量时,就相当于声明了一个新的变量,与旧的变量毫无关系,在编译运算过程中,使用了旧的指向:
fn main() {
let x = 5;
let x = x + 1;
let x = x * 2;
println!("The value of x is: {}", x);
}

4.4 Rust数据类型
Rust 是静态类型语言,共4个标量的类型(scalar type): 整数、浮点、布尔、字符(integers, floating-point numbers, Booleans, and characters),整理了一下,看完就明白了:

4.5 函数简介
- main函数是Rust程序的入口函数,必须要有一个,函数声明
- fn声明函数,函数命名建议为snake模式(全部是小写,使用下划线连接)如下所示
- 函数体使用{}进行包裹
- 每行代码使用分号(;)结束
- 函数体内代码块使用{}包括
- 函数返回值,使用 -> 加返回值类型进行
- 备注说明使用//
//main函数是程序入口,必须要有
fn main() {
println!("Hello, world!");
another_function(5);
}
fn another_function(x: i32) {
println!("The value of x is: {}", x);
}
//DEMO 返回值参数,也可使用return提前返回
//直接在最后一行写返回值时,不能再加分号,否则就会报错
fn five() -> i32 {
5
}
fn main() {
let x = five();
println!("The value of x is: {}", x);
}
4.5 控制逻辑(if-else、loop/while/for)
以下不作详细介绍,具体看代码就好了
fn main() {
let number = 3;
if number < 5 {
println!("condition was true");
} else {
println!("condition was false");
}
}
//类似IIF的应用
fn main() {
let condition = true;
let number = if condition { 5 } else { 6 };
println!("The value of number is: {}", number);
}
//loop 并且带返回值的
fn main() {
let mut counter = 0;
let result = loop {
counter += 1;
if counter == 10 {
break counter * 2;
}
};
println!("The result is {}", result);
}

fn main() {
let a = [10, 20, 30, 40, 50];
let mut index = 0;
while index < 5 {
println!("the value is: {}", a[index]);
index += 1;
}
}

fn main() {
let a = [10, 20, 30, 40, 50];
for element in a.iter() {
println!("the value is: {}", element);
}
}

fn main() {
for number in (1..4).rev() {
println!("{}!", number);
}
println!("LIFTOFF!!!");
}

《第一节结束》如有错误疑问可交流作者:微信+13316098767 QQ:380105206
为方便有需要的同学交流Rust学习,新建(2022-7-26)了QQ交流学习群:515636037