`
zcmit
  • 浏览: 17974 次
文章分类
社区版块
存档分类
最新评论

Rust中文翻译31

 
阅读更多

5.12 结构体


结构体是一个表示复杂数据类型的方式.例如,你可以计算二维坐标,我们需要x和y的值:

let origin_x = 0;
let origin_y = 0;

一个结构体就可以让你将两个值合并成一个独立的值:

struct Point {
x: i32,
y: i32,
}

fn main() {
let origin = Point {x: 0, y: 0}; // origin: Point
println!("The origin is at ({}, {})", origin.x, origin.y);
}

这里有很多代码,我们一点点分析.我们声明了一个结构体,使用struct关键字,然后给他命名.惯例上讲,struct以一个大写字母开头使用camel格式:PointInSpace,而不是Point_In_Space.

我们可以创建一个结构体的示例,通过let,但是我们使用key: value的方式来给每一个成员变量赋值.赋值的顺序不必和声明的顺序一样.

最后,因为成员变量都有名字,我们可以用.来访问他们:origin.x.
结构体中的值默认都是不可变的,就像其他绑定一样.使用mut来让他们可变:

struct Point {
x: i32,
y: i32,
}

fn main() {
let mut origin = Point {x: 0, y: 0};
point.x = 5;
println!("The point is at ({}, {})", origin.x, origin.y);
}

这会打印出 The point is at (5, 0).

Rust在语言级别上不支持成员变量可变,所以你不能这样写:

struct Point {
mut x: i32,
y: i32,
}

可变性是绑定的特性,而不是结构体自身.如果你使用成员变量级的可变性,首先看起来很怪,但是它极大简化了问题.你甚至可以把可变性限定在一段时间内:

struct Point {
x: i32,
y: i32,
}
fn main() {
let mut point = Point { x: 0, y: 0 };
point.x = 5;
let point = point; // 这个新的绑定不能修改了
point.y = 6; // 这会出错
}

5.12.1 更新语法

一个结构体可以包含..来代表你想使用一沓结构体的拷贝,例如:

struct Point3d {
x: i32,
y: i32,
z: i32,
}

let mut point = Point3d{x:0, y:0,z:0};
point = Point3d {y:1, .. point};

这样会把y变成新的值,保留了原有的x和z的值.你也不必使用相同的结构体,你可以试用这个语法来创建新的结构体,它会拷贝你没有明确指定的值:
let origin = Point3d { x: 0, y: 0, z: 0 };
let point = Point3d { z: 1, x: 2, .. origin };

5.12.2 元组结构体(tuple structs)

Rust有一个数据类型看起来像是元组和结构体的结合体,称为元组结构体.元组结构体有一个名字,但是它的成员没有名字:
struct Color(i32, i32, i32);
struct Point(i32, i32, i32);

这两个是不一样的,尽管他们的值都一样:
let black = Color(0, 0, 0);
let origin= Point(0, 0, 0);

使用结构体总是比使用元组结构体好.我们会这样写:

struct Color {
red: i32,
blue: i32,
green: i32,
}
struct Point {
x: i32,
y: i32,
z: i32,
}

我们现在有了确切的名字,而不是位置.好的名字很重要,通过结构体,我们可以有明确的名字.
然而,有一个场景元组结构体很有用,那就是元组结构体只有一个元素.我们称为"新类型"模式,因为它可以让你创建一个新类型,区别于它包含的类型并且表达出它自己的语义:

struct Inches(i32);

let length = Inches(10);
let Inches(integer_length) = length;
println!("length is {} inches", integer_length);

正如你看到的,你可以展开内部整型,通过解构let,就像一个平常的元组.此例中,让let Inches(integer_length)的integer_length赋值为10.

5.12.3 单元结构体

你可以顶一个一个没有成员的结构体:
struct Electron;

这种没有成员的结构体称为"单元",因为它只有一个空的元组,().像一个元组结构体一样,它定义了一个新类型.
这很少用,但是和其他特性一起他可以很有用.例如,一个库会回要求你创建一个结构体来实现一个特性(trait)来处理事件.如果你没有任何数据需要存入结构体,你可以创建一个单元结构体.
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics