Compound Data Type of Rust
Posted 打码匠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Compound Data Type of Rust相关的知识,希望对你有一定的参考价值。
概 述
好久没有更新rust
相关的内容了,更新一波Rust
的内容,本篇讲介绍一下Rust
中的复合数据类型。
Composite Type
复合数据类型
是一种数据类型,它可以原始的基本数据类型和其它的复合类型所构成, 构成一个复合类型的动作,又称作组合。
本文讲介绍一下在Rust
中有tuple
、array
、struct
、enum
几个复合类型。
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 error
For 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)
}
例如上的元素是一个array
,Rust
中的数组和其他语言一样,一组类型相同的元素组成的复合类型,数组在底层存储是一块连续的内存空间。
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
的枚举,Boy
和Girl
是枚举可供使用的值,#[derive(Debug)]
注释是让Gender
自动实现Debug tarit
后面文章将深入。
struct
结构体可以把一些自定义的数据类型通过已有的类型组装成一个新的自定义数据类型,通过struct
关键字就可以创建一个结构体,结构体字段格式name:type
,name
是结构体字段名,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
中的结构体还有两种特殊结构:元组结构体
、单结构体
,枚举也有带有参数
的枚举。。。本文就学习总结了一下常见复合类型的使用,未深入。
以上是关于Compound Data Type of Rust的主要内容,如果未能解决你的问题,请参考以下文章
Argument data type text is invalid for argument 1 of replace function
paddle报ValueError: The type of data we are trying to retrieve does not match the type
paddle报ValueError: The type of data we are trying to retrieve does not match the type
paddle报ValueError: The type of data we are trying to retrieve does not match the type
No qualifying bean of type [org.springframework.data.jpa.repository.JpaRepository] is defined: expec
Sping Cloud项目启动报A component required a bean of type 'com.tianyan.bbc.dao.SecurityUserBaseMapper&