rust基础学习

rust基础学习

rust环境配置

rust在线工具:https://play.rust-lang.org/

如果还没有安装C/C++编译环境,需要先进行安装(可以选择安装visual studio)

Rustup在Windows上是一个可执行程序rustup-init.exe,运行后是命令行形式,如果已经安装了MSVC,直接输入1并回车即可完成安装。输入下图两个命令进行测试,如果能输出版本号说明安装成功:

在vs code中打开文件夹,选择终端->新建终端,输入cargo new greeting,就会在该文件夹下生成一个叫greeting的Rust工程目录,展开后可以看到其自动生成了一个hello world程序main.rs,编译运行效果如下:

rust输出到命令行

rust输出文字的方式主要有两种:println!()print!(),区别在于println!()会在输出的最后加一个换行符。使用格式为格式字符串,加一串可变参数,对应格式字符串中的"占位符",与C语言的printf相似,例如:

fn main() {
    let a = 12;
    println!("a is {}", a); //用{}而不是C语言中的%d
    println!("a is {0}, a again is {0}", a); 
    //在{}之间放一个数字,它将把可变参数当作一个数组来访问,下标从0开始
}

在windows命令行下,要进入.rs文件所在的目录才能使用rustc进行编译,编译后生成文件名.exe文件,直接在命令行输入文件名并回车即可运行

rust基础语法

rust是强类型语言(强制类型定义),但具有自动判断变量类型的能力

let:声明变量

mut:使变量成为可变变量

case 1:
let a = 123;
a = 456;//报错,这里a是不可变变量

case 2:
let mut a = 123;
a = 456;//合法,这里a是可变的

重影(shadowing):变量的名称可以被重新使用的机制,也就是同一个名字重新代表另一个变量实体,其类型、可变属性和值都可以变化

因此,不可变变量与常量不同,在于不可变变量可以重影,而常量不可以:

case 1:
let a = 123;
let a = 456;//合法,因为a是变量

case 2:
const a: i32= 123;
let a =456;//不合法,因为a是32位整型的常量

rust数据类型

  • 整型:i为有符号,u为无符号,后面的数字代表位数,例如i32是32位有符号数,u64是64位无符号数
  • 浮点型:有f32f64,默认为64位浮点数
  • 布尔型:用bool表示
  • 字符型:用char表示,大小为4个字节,一般推荐使用字符串储存UTF-8文字
  • 元组:用( )包括的一组数据,可以包含不同类型的数据
  • 数组:用[ ]包括,是同类型数据,访问格式与C语言类似
//元组类型
let tup: (i32, f64, u8) = (500, 6.4, 1); //则tup.1=6.4
//数组类型
let a = [1, 2, 3, 4, 5]; //数组a也是不可变的
let b: [i32; 5] = [1, 2, 3, 4, 5]; //长度为5的i32数组
let c = [6;4]; //等价于let c = [6,6,6,6];
let first = a[0]; //数组元素访问

PS: rust不支持++--运算符

rust函数

函数格式:用fn关键字进行函数的声明,函数名的命名风格是小写字母,用下划线分割

函数参数:需要声明参数的名称和类型,例如fn another_function(x: i32, y: i32)

函数返回值:在参数声明之后用->声明函数返回值的类型

语句(statement):执行某些操作且没有返回值的步骤,例如let a = 6;

表达式:有计算步骤且有返回值的步骤,例如a+2,表达式末尾没有分号

rust函数体:由一系列可以由表达式结尾的语句组成

嵌套:rust中,函数的定义可以嵌套,可以在一个函数内定义另一个函数

函数体表达式:一种表达式块,在块中可以使用函数语句,最后一个步骤是表达式,此表达式的结果,就是整个表达式块所代表的值,例如:

{
    let x = 3;
    x + 1
};

PS:函数体表达式与函数体不同,不能用return关键字

rust不会自动判断返回值的类型,如果没有明确声明函数返回值的类型,函数将被认为是"纯过程",不允许产生返回值。return后面不能有返回值表达式

rust条件语句

if - else格式支持else if语法,特殊点有:

  • 条件表达式不需要用小括号包括(不是不允许)
  • 不存在C/C++中单语句不需要加{}的规则,必须是一个块,也就是不允许用一个语句代替一个块
  • 条件表达式必须是bool类型,不允许C/C++中用条件表达式用整数表示,非0即真的规则

if <condition> {block 1} else {block 2} 中,每个block也可以是函数体表达式,注意两个函数体表达式的类型必须一样

rust循环

rust支持while循环,但没有C语言中用for循环的三元语句控制循环的用法,需要用while循环代替:

//C语言:
for(int i=0;i<10;i++){
	//循环体
}
//rust:
let mut i = 0;
while i < 10 {
    // 循环体
    i += 1;
}

for循环是最常用的循环结构,常用来遍历一个线性数据结构(e.g. 数组):

fn main() {
    let a = [10, 20, 30, 40, 50];
    for i in a.iter() { //a.iter()代表a的迭代器(iterator)
        println!("value = {}", i);
    }
    for i in 0..5 { //for可以通过下标访问数组
        println!("a[{}] = {}", i, a[i]);
    }
}

loop:无限循环结构,类似于while(true),可以用break语句退出loop循环,并给予外部一个返回值

loop循环常被用来当作查找工具使用:

fn main() {
    let s = ['R', 'U', 'N', 'O', 'O', 'B'];
    let mut i = 0;
    let location = loop { //location可以获得break时的返回值
        let ch = s[i];
        if ch == 'O' {
            break i; //返回值为i
        }
        i += 1;
    };
    println!(" \'O\' 的索引为 {}", location);
}
//运行结果为:'O' 的索引为 3
posted @ 2022-11-12 20:29  瑞图恩灵  阅读(182)  评论(0编辑  收藏  举报