Rust数据类型-复合类型

380 阅读3分钟

这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战

复合类型介绍

复合类型可以将多个值放在一个类型中。

Rust 提供了两种基础的符合类型,分别是元组(tuple)和数组。

元组(Tuple)

元组可以将多个类型的多个值放在一起,需要注意的是元组的长度是固定的,一旦声明之后该元组的长度就无法改变了。

创建元组的方法和python相同,在小括号中将值用逗号分开,元组中的每个位置都对应一个类型,元组中各个元素的类型不必相同。使用tuple.N 的方式可以访问索引为N的元素。当然也可以使用模式匹配来解构(destructure)一个元组获取元素的值。

如果元组中只保存一个元素时,此时必须不能省略最后的逗号。

fn main() {
    let tup: (bool, i32, usize, f64, char) = (true, 128, 256, 6.2, 'h');  // 标准的定义元组的方式,标注每个元素的类型
    let (x, y, z, a, b) = tup;
    println!("{}, {}, {}, {}, {}", x, y, z, a, b);
    println!("{}, {}, {}, {}, {}", tup.0, tup.1, tup.2, tup.3, tup.4)
}

需要注意的是,访问tuple 元素的索引必须是编译期间就能确定的数值不能是变量。

fn main() {
    let a = (1, 2.0);
    let b = 1;
    println!("{}", a.b)  // 会出现typeerror的错误
}

通常情况下会将元组用来作为简单的数据组合体,比如有关联的一组信息就可以保存到一个元组中。

fn main() {
    // 表示一个人的name和age
    let name = "rust";
    let age = 10;
    println!("{}, {}", name, age);
    // 与其将有关联的数据分开保存到多个变量中不如保存到一个数据结构中
    let info = ("rust", 10);  // 同时存放&str和i32类型的数据
    println!("{}, {}", info.0, info.1);
}

数组(Array)

数组也可以将多个值放在一个类型里,数组中每个元素的类型必须相同,而且数组的长度也是固定的,一旦声明之后数组的长度就是不可变的。

声明数组时,和其他语言一样,在中括号内,每个值用逗号分开,同样的,如果数组中只有一个元素,那么建议也不要省略最后的逗号。

在声明数组时可以指定数组中元素的类型和数组的长度,表示方式为[type; ntype表示数组中元素的类型,n表示定义数组的长度。

在声明数组的时候有一种特殊情况,就是如果数组中的每个元素的值都相同,那么就可以在声明类型时在中括号中指定初始值,然后是一个;,最后是数组的长度。

如果想要访问数组的元素,可以使用索引的方式,如果访问的索引超出了数组的范围那么Rust在编译时可能会报错也可能会通过,原因就是Rust在编译时会对索引进行简单的检查,但是在运行时一定会报错。

fn main() {
    let a: [i32; 3] = [1, 2, 3]; // 标注数组的类型
    let b = [5; 3];  // 就相当于 let b = [5, 5, 5]
    let a_first = a[0];  // 使用索引访问a数组的元素值
    println!("{}", a_first);
    
    // 讨论索引溢出
    let index = 4;
    let val_a = a[index];  // 此时编译和运行都会报错,这是简单的情况下
    
    let val_a_complex = a[b[0]];  // 代码稍微复杂一些,但是此时编译不会报错,但是在运行的时候会报错
}

如果想让数据存放在stack上而不是heap上,或者想保证有固定数量的元素,这时使用数组就很方便了,在Rust 中还有一种和数组类似的数据结构Vector,但是Vector更加灵活,它的长度是可以变化的,这个类型在后面的文章中再继续讲解。

结语

文章首发于微信公众号程序媛小庄,同步于掘金

码字不易,转载请说明出处,走过路过的小伙伴们伸出可爱的小指头点个赞再走吧(╹▽╹)