自定义类型
这里我们将学习两种最基础的组合类型 : struct 和 tuple
struct 对于C语言开发同学一定不陌生了,元组类型对于python的开发同学一定也不陌生
struct 和 tuple 还是有一点类似的,struct 是有名的变量集合,tuple 更像是无名的struct(只可以使用一次)
元组
元组一般用来组合 一组不同类型,但是有关联性的变量,RUST 借鉴了其他语言的优点,支持元组类型
- 元组也是在栈上申请内存的,意味着一旦定义,其大小不允许在发生变化
- 元组通过 t.0,t.1,t.2 下标访问
- 最新rust版本支持元组的解构 以及定义一个变量元组,然后解构
- 元组长度目前仅支持10个元素(考虑栈上内存有限)
练习1: 元组的声明和访问
fn main() {
let _t0: (u8,i16) = (0, -1);
// Tuples can be tuple's members
let _t1: (u8, (i16, u32)) = (0, (-1, 1));
// Fill the blanks to make the code work
let t: (u8, __, i64, __) = (1u8, 2u16, 3i64);
println!("Success!");
let t = ("i", "am", "sunface");
assert_eq!(t.1, "sunface");
println!("Success!");
}
练习2: 使用元组解构初始化
fn main() {
let tup = (1, 6.4, "hello");
// Fill the blank to make the code work
let () = tup;
assert_eq!(x, 1);
assert_eq!(y, "hello");
assert_eq!(z, 6.4);
println!("Success!");
}
练习3: 定义一个变量元组 稍后初始化
fn main() {
let (x, y, z): (i32,i32,i32);
// Fill the blank
__ = (1, 2, 3);
assert_eq!(x, 3);
assert_eq!(y, 1);
assert_eq!(z, 2);
println!("Success!");
}
结构体
RUST 结构体基本上和其他语言类似
- struct 默认在栈上申请内存
- RUST 支持空元素的结构体
- RUST 支持匿名元素结构体,类似元组
- RUST 支持 sturct 解构
- RUST 不允许 声明结构体中某个变量为可变,只允许整个结构体声明为可变
练习1: struct基本使用
// Fix the error 必须初始化所有字段
struct Score{
math: i32,
english: i32,
}
fn main() {
let eng_score = 80;
let math_score = 90;
let p = Score {
math: math ,
};
println!("Success!");
}
练习2: 允许空的结构体
struct Score;
fn main() {
let emptr_score = Score; //空的结构体 内存为0
println!("Success!");
}
练习3: 允许元素匿名的结构体
//匿名元素 结构体很像元组
struct RGB(u8,u8,u8);
fn main() {
let color: RGB = RGB(0,0,255); //匿名结构体初始化类似元组
let red = color.0; //通过下标访问匿名结构体 类似元组
let RGB(red,green,black) = color; //支持结构体解构
println!("Success!");
}
练习4: 支持有名结构体的解构
//匿名元素 结构体很像元组
struct Score{
math: i32,
english: i32,
}
fn main() {
let eng_score = 80;
let math_score = 90;
let p = Score {
math: math_score ,
english: eng_score,
};
let Score{math:x, english:y} = p; // 支持结构体解构 变量
let Score{math, english} = p; // 支持结构体解构 变量
println!("{}{}",x,y);
}