携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情
写在前面
不同于Javascript在Rust中,数据类型是更为复杂且详细的,可以根据不同平台来指定不同的数据类型比如Integer还可以分为Signed无符号 Unsigned有符号 多样的类型使得Rust可以知道如何处理这些数据从而让应用更好的适配兼容不同平台
Integer
Integer类型即整数 它是不允许有小数点的,在Rust中一共有6种整型Integer类型可以指定,具体可以参考下方表格
| Length | Signed | Unsigned |
|---|---|---|
| 8-bit | i8 | u8 |
| 16-bit | i16 | u16 |
| 32-bit | i32 | u32 |
| 64-bit | i64 | u64 |
| 128-bit | i128 | u128 |
| arch | isize | usize |
从8-bit一直到128-bit Rust为我们提供了非常丰富的覆盖全平台的整数类型,这也是Rust也可以用于嵌入式开发的原因之一,但如果你不想了解这些复杂的数据类型也没问题,可以直接使用arch来指定整数类型,isize和usize的类型长度将会由Rust根据当前环境的计算机架构来自动分配
进制的表示
Rust也支持不同进制的整型表示,表示方式如下
| Number literals | Example |
|---|---|
| Decimal | 98_222 |
| Hex | 0xff |
| Octal | 0o77 |
| Binary | 0b1111_0000 |
Byte (u8 only) | b'A' |
其中Byte类型只能定义为u8也就是无符号的8-bit,如果不清楚应该使用哪种的话可以使用Rust提供的默认类型i32,具官方文档的定义它通常是最快的
Float
在Rust中浮点型分为两种,一种是f32(单精度)还有一种是f64(双精度),如果不指定具体浮点类型的话Rust会进行类型推断从而给出一个默认的浮点数类型f64在现代CPU上它的精度会比f32更高速度和f32差不多,并且所有的浮点类型都是有符号的,并且遵循了IEEE-754标准,示例如下
fn main() {
let float64 = 2.0; // 自动类型推断会给出默认值f64
let float32: f32 = 3.0; // f32
}
数值运算
和其他语言一样Rust同样提供了基本的加、减、乘、除和取余的运算操作,用法如下和其他语言基本一致
需要注意的是,当两个Integer类型的数值进行运算的时候Rust返回的结果也将会是Integer的数值,并且Rust并不会将结果四舍五入,所以在下面的代码中2 / 3的结果会是0
fn main() {
// addition
let sum = 5 + 10;
println!("{}", sum);
// subtraction
let difference = 95.5 - 4.3;
println!("{}", difference);
// multiplication
let product = 4 * 30;
println!("{}", product);
// division
let quotient = 56.7 / 32.2;
println!("{}", quotient);
let floored = 2 / 3; // 需要注意这里的返回值会是0
println!("{}", floored);
// remainder
let remainder = 43 % 5;
println!("{}", remainder);
}
运行结果如下
Boolean
布尔值在Rust中的大小未1 byte定义方法和使用方法和其他语言相同如下
fn main() {
let flag1 = true;
let flag1: bool = false; // 也可以手动为其指定类型
}
Char
字符类型,和C语言一样Rust提供了字符型,它在定义的时候需要使用单引号''大小为4 byte这使得它可以放得下一个中文,甚至可以是一个emoji表情
fn main() {
let c = '中';
let z: char = '国';
let heart_eyed_cat = '❤';
}
复合类型
Rust中一共有两种复合数据类型分别是Array和Tuple,下面来看看如何定义使用它们
- Tuple
元组和数组不同,它具有固定长度,元组一旦被声明之后长度将不能再被改变,它的元素可以由任意数据类型组成,定义它和定义数组一样简单,我们可以直接像访问对象的属性一样来获得元组的元素,具体示例如下
fn main() {
let tup1 = (1, 2.0, "Juejin");
println!("{:?}", tup1);
println!("也可以像访问对象一样获得元组里的元素{0}", tup1.2);
}
- Array & Vector
在Rust中数组是固定长度的,同时也支持Vector动态长度的数组,但是这在官方文档中明确指出了会影响性能,我们可以这样指定固定长度的数组
fn main() {
let a: [i32; 5] = [1, 2, 3, 4, 5];
// 同时也支持批量创建
let b: [i32; 5]; // 它等同于 let b: [i32; 5] = [5, 5, 5, 5, 5];
}
上面的变量a在声明的时候就已经明确指出了元素类型为i32整型,并且长度为5 这是不可改变的,创建可变"数组"可以像下面这样
fn main() {
let mut a: Vec<i32> = Vec::new(); // 这样就创建了一个名为a的Vector
a.push(99); // push 一个99的整数
println!("{}", &a[0]) // 打印出a中下标为0的数据
}
在上面代码中首先使用let mut创建了一个名为a的变量并为其指定了Vec<i32>类型赋于了一个新的Vec实例化对象,之后又往Vector里面添加了一条数值为99的数据并且打印出来,效果如下图
最后
学习Rust的第三天结束了,到这里已经对于Rust有了一个大概的了解,接下来准备了解一下Cargo