Rust基础

Rust基础

变量与可变性

在Rust中变量是默认不可变的,如果要定义一个可变变量必须使用mut修饰.

1
2
let x=5; //x是不可变的变量
let mut mutable_variable=6; // mutable_variable是可变变量

变量与常量的区别

  1. 常量不只是不可变,而是一直不可变.
  2. 你需要使用const而不是let声明一个常量,必须加上数据类型注解
    1
    const MAX_POINT:u32=12_000;
  3. 常量可以定义在任何作用域.
  4. 常量必须设定成一个常量表达式,既不是一个函数的结果,也不是其他只能在运行时计算出的结果.

Shadowing

同一个变量名可以多次定义,后一次定义会覆盖前一次的定义,如下所示

1
2
let x:i32=5;
let x:u32=6;

备注: Shadowing不同与mut,Shadowing是定义一个新的变量.

数据类型

Rust中有两种数据类型子集:标量(Scalar),混合量(Compound);

标量(Scalar)

标量类型代表单个值.Rust有四种基本的标量类型:整型,浮点型,字符型,布尔型.

整数

长度 有符号 无符号
8bit i8 u8
16bit i16 u16
32bit i32 u32
64bit i64 u64
128bit i128 u128
arch isize usize

备注:

  • 有符号的取值范围为 -2^(n-1) – 2^(n-1)-1;
  • 无符号的取值范围为 0 – 2^n-1
  • isize和usize的长度,取决于架构类型,如果是64位架构,那就是64bit,如果是32位架构,那就是32bit.
整数的字面量书写形式
字面量 示例
十进制(Decimal) 10_000
十六进制(Hex) 0xff
八进制(Octal) 0o12
二进制(Binary) 0b111_000
Byte(u8) b’A’
整型溢出

当发生整型溢出时,Debug模式下Rust会检查并抛出错误信息,而在Release(–release)模式下,Rust不会检查,Rust执行二进制补码包装.例如u8类型,256变成0,257变成1.

浮点数

Rust支持单精度已经双精度的浮点类型分别为f32,f64,参考IEEE-754标准.

1
2
let f1=3.0; // f1 data type is f64
let f2:f32=3.0; //f2 data type is f32

备注:默认的浮点类型为f64,现代的cpu对于f64与f32的处理速度差不多,而f64进度更高.

算术运算

布尔类型(Boolean)

Rust中的布尔类型为bool,占用1个字节,可取值为false,true;

1
2
let x=false;
let y=true;

字符类型(Character)

Rust中的字符类型关键字为char,占用4个字节,存储Unicode标准值.

1
let c='a';

混合量(Compound)

混合量表示可以含有多个值的数据类型.Rust支持两种基本的混合量:元组(Tuple),数组(Array)

元组(Tuple)

元组是由不同类型的多个值组成的一个混合量,元组具有固定的长度,一旦声明,无法增加或者减少.

1
2
3
let tup=(1,2,3);
let (x,y,z)=tup;
let first_number=tup.0;

数组(Array)

数组是由多个同类型的值组成的一个混合量,不同于元组,数组的每一个值的类型都是一样的,数组的长度是固定的.

1
2
3
4
5
6
7
8
//定义数组
let a = [1,2,3,4,5];
//指定类型为i32,长度为3
let b[i32;3]=[1,2,3];
//重复5次填充3
let repeat=[3;5]; // as [3,3,3,3,3];
//访问数组
let first_element=a[0];

备注:Rust会对数组访问进行越界检查,越界访问会抛出异常(panic)

函数

函数由fn关键字,函数名,参数列表,返回类型,函数体组成;其中参数列表,返回类型可以省略;
语法如下

1
2
3
4
5
6
7
8
//无返回值,无参数
fn test(){

}
fn area(width:u32,height:u32)->u32{
return width*height;
}

函数体

函数体可以包含语句以及表达式(表达式只能在尾部作为返回值)

备注:语句与表达式:语句是执行一些动作但没有返回值的指令;表达式被计算有一个结果.
例如

1
2
3
fn main(){
let y=6;
}
1
2
3
4
fn main(){
//error: expected expression, found statement (`let`)
let x=(let y=6);
}

注释

1
// comment

控制流

条件

if表达式

1
2
3
4
5
6
7
8
let x=3;
if x>10 {

}else if x>5 {

}else{

}

let语句中使用if表达式

1
2
3
4
5
6
let x=4;
ley y= if x>0 {
1
}else{
-1
}

备注:各个分支的返回必须是相同的.

循环

无限循环(loop)

loop关键字,循环执行一段指令,直到显示的停止;

1
2
3
loop{
println!("Again!");
}

loop循环体是可以返回值

1
2
3
4
5
6
7
let n=1;
let sum=loop{
n=n+1;
if n >= 10 {
break n*2;
}
}

条件循环(while)

1
2
3
4
5
let n=10;
while n>0 {
println!("{}!",n);
n=n-1;
}

遍历(for)

1
2
3
4
5
6
7
8
let a=[1,2,3];
for element in a.iter(){
println!("The value is :{}",element);
}

for number in (1..4){
println!("{}!", number);
}