概 述

良久没有更新rust相干的内容了,更新一波Rust的内容,本篇讲介绍一下Rust中的复合数据类型。

Composite Type

复合数据类型是一种数据类型,它能够原始的根本数据类型和其它的复合类型所形成, 形成一个复合类型的动作,又称作组合。

本文讲介绍一下在Rust中有tuplearraystructenum几个复合类型。

tuple

tuple元组,元组类型是由多个不同类型的元素组成的复合类型,通过()小括号把元素组织在一起成一个新的数据类型。元组的长度在定义的时候就曾经是固定的了,不能批改,如果指定了元素的数据类型,那么你的元素就要对号入座!!!否则编译器会教训你!

例子:

fn main() {    // 指定数据类型    let tup_type:(i8,i32,bool) = (21,-1024,true);    // 解构元素    let (one,two,three) = tup_type;    // 二维的元组    let tup_2d:(f64,(i8,i32,bool)) = (3.1415927,(one,two,three));    println!("tup_2d = {:?}",tup_2d);    // 索引    println!(" = {:?}",tup_2d.0);}

元组的拜访形式有好几种,通过下标去拜访,也能够应用解构赋值给新的变量去拜访,然而不反对迭代器去拜访。

for v in tup_2d.1.iter() {        println!("{}",v)}
   Compiling playground v0.0.1 (/playground)error[E0599]: no method named `iter` found for tuple `(i8, i32, bool)` in the current scope  --> src/main.rs:10:23   |10 |     for v in tup_type.iter() {   |                       ^^^^ method not found in `(i8, i32, bool)`error: aborting due to previous errorFor more information about this error, try `rustc --explain E0599`.error: could not compile `playground`To learn more, run the command again with --verbose.

元组的每个元素的类型能够不同,因而您无奈对其进行迭代。元组甚至不能保障以与类型定义雷同的顺序存储数据,因而即便您本人为它们实现Iterator,它们也不适宜进行无效的迭代。

然而如果元素是反对实现了Iterator就能够通过.iter()进行迭代拜访。

    let mut arrays:[usize;5] = [0;5];        for i in 0..5 {        arrays[i] = i+1;    }        println!("{:?}",arrays);        let tup_arr:(&str,[usize;5]) = ("tup_arr",arrays);        println!("{:?}",tup_arr);        for v in tup_arr.1.iter() {        println!("{}",v)    }

例如上的元素是一个arrayRust中的数组和其余语言一样,一组类型雷同的元素组成的复合类型,数组在底层存储是一块间断的内存空间。

array

Rust中的数组申明是[T;n]进行的,T是元素类型,n是这组元素有多少个坑位,创立的时候能够去掉类型和大小,程序会主动推断进去。

    // 数组    let arr:[f32;3] = [1.0,2.2,3.33];        println!("{:?}",arr);        // 类型主动推导    let arr_infer = ["Hello",",","World!"];        let mut str = String::new();    // 迭代器    for v in arr_infer.iter() {        str.push_str(v);    }        println!("str = {}",str);

点击查看元组代码案例

enum

枚举类型,如果你之前从事过Java相干的开发应该不生疏,在Rust外面也有枚举类型,枚举类型是一个自定义数据类型,通过enum关键字来申明,body外面能够蕴含多个自定义的枚举值,枚举能够用来限度某个值或者类型范畴。

    #[derive(Debug)]    enum Gender {        Boy,        Girl,    }

下面就定义一了个类型名字为Gender的枚举,BoyGirl是枚举可供使用的值,#[derive(Debug)]正文是让Gender主动实现Debug tarit前面文章将深刻。

struct

构造体能够把一些自定义的数据类型通过已有的类型组装成一个新的自定义数据类型,通过struct关键字就能够创立一个构造体,构造体字段格局name:typename是构造体字段名,type是字段的类型,默认是不可变的。

fn main() {    // 枚举当初取值范畴    #[derive(Debug)]    enum Gender {        Boy,        Girl,    }        // 定义一个构造体    #[derive(Debug)]    struct Programmer<'skill> {        name: String,        skill: [&'skill str; 3],        sex: Gender,    }        // 创立一个实例    let engineer = Programmer {        name: String::from("Jaco Ding"), // String类型内容可变        skill: ["Java","Go","Rust"], // 一个长度为3的字符串面量类型的数组        sex:Gender::Boy, // 通过枚举限度参数类型    };        println!("engineer = {:?}",engineer);}

有了自定义的类型了也就是struct就能够通过自定义的类型来解决一些非凡的需要了,例如上面的代码定义了一个元素类型为Programmer长度为2的数组。

    let Doris = Programmer {        name: String::from("Doris"),        skill: ["Vue","TypeScript","JavaScript"],        sex:Gender::Girl,    };        let Jaco = Programmer {        name: String::from("Jaco"),        skill: ["Java","Go","Rust"],        sex:Gender::Boy,    };        let employees:[Programmer;2] = [Doris,Jaco];        for e in employees.iter() {        println!("{:?}",e)    }

构造体Programmer上的<'skill> 解决skill数组的生命周期问题undeclared lifetime,所有权问题,所有权是Rust语言外围的知识点,这些在前面文章中缓缓更新。

小结

Rust中的构造体还有两种非凡构造:元组构造体单构造体,枚举也有带有参数的枚举。。。本文就学习总结了一下常见复合类型的应用,未深刻。