元组、结构体
元组(Tuple)
Rust的元组与Python一样。
let y = (2, "hello world");
let x: (i32, &str) = (3, "world hello");
使用元组多值绑定
let (w, z) = y; // w=2, z="hello world"
访问元组中的元素
let f = x.0; // f = 3
let e = x.1; // e = "world hello"
结构体(struct)
Rust的结构体与Go的类似,但Rust有一些特有的结构体表达形式。结构体通常以大写字母开头,使用驼峰命名法。
struct Point {
x: i32,
y: i32,
}
let point = Point { x: 0, y: 0 };
需要注意,Rust在语言级别不支持字段是可变的,所以不能这么写:
struct Point {
mut x: i32, // 错误
y: i32,
}
元组结构体(tuple struct)
元组结构体是由元组和结构体混合构成,元组结构体有名称, 但是域没有。
元组类型结构体使用小括号,类似 tuple。
struct Color(u8, u8, u8);
let green = Color(0xa4, 0xc6, 0x39);
let Color(red, green, blue) = green;
它可以看作是一个有名字的元组,具体使用方法和一般的元组基本类似。
新类型
当元组结构体
只有一个域时,称为新类型 (newtype)。
struct Inches(i32);
let length = Inches(10);
let Inches(integer_length) = length; // 模式匹配,将integer_length绑定为10。
空结构体(类单元结构体)
结构体内部也可以没有任何字段。也被称为类单元结构体 (unit-like struct)。
struct EmptyStruct;
let empty = EmptyStruct;
空结构体的内存占用为0。但是我们依然可以针对这样的类型实现它的“成员函数”。
注意,空结构体后面不能加大括号。除了1.9 nightly版本,其他版本编译会报错:
struct C {
}
struct的..
符号
struct使用..
从其它结构体拷贝一些值,或者在解构时忽略一些字段。
例:拷贝值与忽略字段。
struct Point3d {
x: i32,
y: i32,
z: i32,
}
// 绑定
let origin = Point3d{x:1,y:2,z:3};
// 复制origin中的值,并将y的值覆盖为1.
let point = Point3d { y: 1, ..origin };
// 忽略掉z的值. 该语句可以会报编译警告.但可以通过编译.
let Point3d { x: x0, y: y0, .. } = point;
println!("({:?},{:?})",x0, y0); // 输出 (1,1)