Rust快速学习入门(第一节)

目录

0.背景

1. Hello World

2. 安装

3. 实战(猜数游戏)

4. 基本概念

4.1 变量的可变与不可变(mutable/imutable)

4.2 常量与变量

4.3 Shadow(影子变量)

4.4 Rust数据类型

4.5 函数简介

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 函数简介

  1. main函数是Rust程序的入口函数,必须要有一个,函数声明
  2. fn声明函数,函数命名建议为snake模式(全部是小写,使用下划线连接)如下所示
  3. 函数体使用{}进行包裹
  4. 每行代码使用分号(;)结束
  5. 函数体内代码块使用{}包括
  6. 函数返回值,使用 -> 加返回值类型进行
  7. 备注说明使用//
//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