Bootstrap

Rust学习(三):rust基础Ⅱ

Rust学习(三):rust基础Ⅱ

上一篇文章,我们了解了什么是变量,常量,数据类型等Rust中的基础知识,本篇文章,将进一步介绍Rust的有关基础知识,帮助读者更好的理解rust的编程哲学。

1、语句和表达式:

rust中最基础的语法句型有两类:语句和表达式。官方的定义是:语句指要执行的一些操作和产生作用的表达式,而表达式单纯用于求值。具体可以理解为:语句可以用于求值并返回结果,相当于C中的:return 返回值; 表达式则只用于求值,无特使含义。可以简单区分为:以分号结尾的是表达式,没有分号结尾的是语句。在rust的编写过程中,表达式使用更为广泛,语句一般使用于函数体中,作为返回值。

// 语句在函数中的使用:
fn sum_of_nums(nums:i32) -> i32{
    nums.iter().sum::<i32>()  // 注意!没有分号,这是一个语句,相当于return nums.iter().sum::<i32>()
}

// 表达式
let x = 5;
let y = x + 1

2、运算符:

运算符是用于指定表达式计算类型的标志或符号,常见的有算术运算符、关系运算符、逻辑运算符、赋值运算符和引用运算符等,和其他编程语言的运算符基本一样,这里就不过多介绍了,感兴趣的读者,可以上网自行查阅(doge)

3、流程控制:

流程控制是指:根据是否满足某个条件来决定是否执行某段代码或重复执行某段代码的能力,大部分编程语言都具有该功能,也就是大家熟知的:循环和条件判断。

(1)rust中的条件分支:

在rust中使用最多的条件分支是:if…else…条件判断语句,if可以和let关键字结合使用从而更加便捷的实现复杂功能:

let a = 3;
if a > 5 {
    println!("a大于5");
} else if a > 3 {
    println!("a在3到5之间");
} else {
    println!("a小于3");
}

// if和let配合使用
//① let if 
let x = 3; let y = 4;
let z = if x < 4 {
    true
} else {
    false
};

// ② if let
let same_value = Some(5);
if let Some(value) = same_value {
    println!("value:{}", value);
} else {
    println!("no value");
}

match也是rust中非常常见,且强大的条件控制语句:

let a = 10;
match a {
    0 => println!("0 == a"),
    1..=9 => println!("a > 0 and a <= 9"),
    _ => println!("10 <= a"),
}

(2)rust中的循环结构:

①loop关键字:

控制代码重复执行——直到满足某个条件之后才会停止:

let mut a = 12;
let res = loop {
    if a < 0 {
        break a;
    }
    a -= 1;
};
// 死循环
loop {
    if res > 0 {
        break 0;
    }
}
②while循环:
let num = 10;
while num > 0 {
    println!("num = {}", num);
    num -= 1;
}
③for循环:
let nums = [1,2,3,4,5]

for i in nums {
    println!("value:{}", i);
}

4、函数:

函数是编程语言中一个非常重要的构建,Rust默认使用fn来定义函数,和C语言一样主函数都是main函数。需要注意的是:rust定义的函数写在main主函数前后都可以,无需特别声明,对于返回值Rust默认采用的是:不带分号的语句,当然使用“return 返回值;”也是可以的:

fn main() {
    let res = add(1,2);
    println!("1+2={}", res);
}

fn add(a:i32, b:i32) -> i32 {
    a + b
}

其他rust基础内容,可以编写一个如下的demo(可以先看一下,有一个总体的感觉):

use std::cmp::max; // 导入函数
use math::add;

// 公开模块:
pub mod math {
    // mod中的函数默认是私有的
    pub fn add(a:i32, b:i32) ->i32 {
        a + b
    }
    fn is_zero(num: i32) ->bool {
        num == 0
    }
}

// 结构体:
#[derive(Dedug)]
struct Circle {
    radius: f32,
}

impl From<i32> for Circle {
    fn from(radius: f32) -> Self {
        Self {
            radius
        }
    }
}

fn calc_func(num1: i32, num2: i32) -> i32 {
    let x = 5;
    let y = {
        let x = 3
        x + 1
    };
    max(x, y)
}

// 定以主函数:
fn main() {
    let num1 = 1;
    let num2 = 2;
    
    println!("num1 + num2 = {}", add(num1, num2));
    println!("res : {}", calc_func(num1, num2));
    let f: f32 = 9.85;
    let c: Circle = Circle::from(f);
    println!("c:{:?}", c);
}
;