Rust学习第三天-基本数据类型

128 阅读5分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情

写在前面

不同于JavascriptRust中,数据类型是更为复杂且详细的,可以根据不同平台来指定不同的数据类型比如Integer还可以分为Signed无符号 Unsigned有符号 多样的类型使得Rust可以知道如何处理这些数据从而让应用更好的适配兼容不同平台

Integer

Integer类型即整数 它是不允许有小数点的,在Rust中一共有6种整型Integer类型可以指定,具体可以参考下方表格

LengthSignedUnsigned
8-biti8u8
16-biti16u16
32-biti32u32
64-biti64u64
128-biti128u128
archisizeusize

8-bit一直到128-bit Rust为我们提供了非常丰富的覆盖全平台的整数类型,这也是Rust也可以用于嵌入式开发的原因之一,但如果你不想了解这些复杂的数据类型也没问题,可以直接使用arch来指定整数类型,isizeusize的类型长度将会由Rust根据当前环境的计算机架构来自动分配

进制的表示

Rust也支持不同进制的整型表示,表示方式如下

Number literalsExample
Decimal98_222
Hex0xff
Octal0o77
Binary0b1111_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);
}


运行结果如下 image.png

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中一共有两种复合数据类型分别是ArrayTuple,下面来看看如何定义使用它们

  • 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的数据并且打印出来,效果如下图

image.png

最后

学习Rust的第三天结束了,到这里已经对于Rust有了一个大概的了解,接下来准备了解一下Cargo