Rust基础(01) 通用编程概念
本文面向有一定编程基础的同学
Rust 中的基本数据类型
标量
Rust 基本数据类型(标量)大的来说分为整型,浮点型,字符型,布尔型。
整型中分为按照是否有符号位分为有符号整型和无符号整型,按位数分为8位,16位,32位,64位。两者结合产生8种整型数据类型,及有符号的:i8
, i16
, i32
, i64
,以及无符号的:u8
, u16
, u32
, u64
,同时还有 isize
,和 usize
两种依据操作系统架构而定的两种类型,及在 32位操作系统中为 i32
和 u32
,在64位操作系统中为 i64
和 u64
(可对比Golang 中的int
类型)。
浮点型则只有 f32
和 f64
两种类型,同样只有两种类型的还有布尔类型,只有 false
和 true
,不做赘述。
字符型则是使用单引号包裹的单个字符,关于字符型,我们会在以后有机会深入探讨,此处先按下不表。
对于数值型 Rust 允许在数值末尾添加具体数据类型作为标识如 789u8 就标识值为 789的无符号8位整数(显然已经超出范围)。
复合类型
Rust基本数据类型中的复合数据类型包括元组和数组。
数组与其他语言基本相似:
- 使用方括号包裹
- 使用逗号作为分隔
- 元素必须是相同数据类型
- 通过方括号加下标访问数组元素
- 下标从0开始
- 数组长度不可变
let arr = [1,2,3,33];
arr[0];
元组与数组的概念基本相似,不同点在于
- 元组中的元素数据类型可以不同
- 元组使用圆括号包裹元素
- 元组通过点加下标访问元素
let tup = (1,2,3,"$");
tup.0;
变量及其声明
Rust 通过 let
关键字定义变量比如下面这样:
let i = 100;
也可以在声明的时候指定变量的数据类型
let i: i32 = 100;
如果不在申明的时候指定数据类型,则编译器会通过赋值来进行类型推断。比较特殊的是元组和数组的指定数据类型方式如下:
// 在方括号中第一个位置表示元素数据类型,第二个位置表述元素个数
let arr:[u8; 4] = [1,2,3,33];
// 元组则是依次指定所有元素的数据类型
let tup:(u8,u8,u8,&str) = (1,2,3,"$");
控制流
控制流无外乎就是分支和循环。
分支
Rust 的分支有:if
,match
。即便不用说明你也应该能猜到既然支持 if 那么对于 if-else
, if-else-if
这样的结构自然也是支持的,在写法上与其他语言(如Golang)也基本一样,if
语句只能判断 bool 值——没有C语言那样的非零既为真的规则,Rust 中传给 if 进行判断的表达式最终必须要得出一个 bool 值。
if 5 > 2 {
println!("5 > 2");
}
关于 match
会在后续和模式匹配一起讲解,此处先挖一个坑,你可以你可以理解为 match
是Rust 提供的一个比switch
更牛逼的多路分支结构语句(只能这样粗略的认为,Rust 并没有提供 switch 语句,而且 match 与 switch 的可比性并不强,这样说只是意在帮你快速构建一个Rust的印象)。
循环结构
Rust 中的循环结构有:loop, while,do-while,for。
// 一個普通的 for 循環,`..` 是 `Range` 的語法
for i in 1..100 {
print!("{},",i);
}
println!();
// 普通的 loop 循環,直到手動調用 break 退出之前都會一直循環執行
let mut i = 100;
loop {
print!("{},",i);
i -= 1;
if i <= 0 {
break;
}
}
println!();
// 另一個普通的 loop 循環,但是可以通過 break 返回一個值
let mut i = 1000;
let mut c:u32 = 0;
let count = loop {
c += 1;
i /= 2;
if i <= 0 {
break c
}
};
println!("{}", count);
// 這個沒啥好說的
while i < 100 {
i += 1;
}
除了在 loop 中可以通過 break 返回值之外,Rust 基本與其他語言的循環控制結構沒啥不一樣。
函數
在講函數之前稍微提兩個概念: 表達式和语句——经过一系列的动作之后没有任何返回的叫語句,有返回的叫表達式。假如把 Rust 当中的任何行爲都看作函數調用,那麼就是有返回值的函數是表達式,沒有返回值的函數是語句(不要說你把返回值當參數傳遞的情況)。
那麼這兩個概念有什麼作用呢?那就是關於函數返回值,除了顯示的調用 return
返回,Rust 會講函數的最後一個語句的結果當作返回值返回,而不需要使用 return
手動返回。比如下面的函數都返回相同的結果。.
fn add_1(a: i32, b: i32)-> i32{
a+b
}
fn add_2(a: i32, b: i32)-> i32{
return a+b;
}
從這兩個例子中你也可以看見:
fn
是函數申明關鍵字fn
之後的是函數名- 返回值數據類型通過
->
指定 - 參數需要指定數據類型(不可以像 go 那樣一次指定多個參數的數據類型)
- 返回值通過
return
指定或由最後一個表達式返回。