元组、结构体

元组(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)

results matching ""

    No results matching ""