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)来处理事件.如果你没有任何数据需要存入结构体,你可以创建一个单元结构体.
分享到:
相关推荐
rust自动翻译中文rust自动翻译中文,除
欢迎阅读!这本书将教会你使用Rust编程语言。
Rust 核心库和标准库中文翻译 Rust 核心库和标准库中文翻译 Rust 核心库和标准库中文翻译 Rust 核心库和标准库中文翻译 Rust 核心库和标准库中文翻译 ...
官网最新翻译。
Rust 代码和资源的精选列表中文翻译
官网最新翻译。
中文版(Rust by Example)Rust社区官方翻译,翻译精准可靠,非常适合Rust入门学习,主要讲述Rust基本语法
Rust Reference 的中文翻译,预期能及时和原文保持同步rust-reference-master.zip
Steve Klabnik 和 Carol Nichols,以及来自 Rust 社区的贡献(Rust 中文社区翻译) 本书假设你使用 Rust 1.37.0 或更新的版本,且在所有的项目中的 Cargo.toml 文件中通过 edition="2018" 采用 Rust 2018 Edition ...
Rust 核心库和标准库中文翻译,可作为 IDE 工具的智能提示,并生成本地 API 文档
Rust 程序设计语言 简体中文版 ---------------------------------------------------- 本 ePub 基于开源文档,目录书签齐全。 版权归原作者,翻译版权归译者。 --------------------------------------------------...
中文翻译:<rust-lang/rustlings> 帮你扶住 Rust 的那双手 ❤️ ✅
官网最新翻译。
Rustc Dev Guide 中文翻译 的中文翻译已经启动。因为原项目还在变动期,为了翻译方便,所以此翻译项目组织结构就不和原项目保持一致了。志愿者招募要求:热爱 Rust,对 Rust 已经有一定了解想深入了解 Rust 编译器想...
本文档为 The Rust Programming Language 的中文翻译。
Rust编程语言 rust-book 中文翻译 (进行中...) 本项目是对的中文翻译, 力求语言准确,正确还原原文内容,规避任何看起来像机器翻译的句子。 完整书籍: github: 勘误:
:globe_with_meridians: 这是《 The Rust Programming Language》一书的法文翻译 翻译在文件夹中。 其他所有内容都应保留在英语书中(某些必需的文件除外,例如README.md) 。 想要帮助翻译吗? 请阅读文件 ! ...
目前翻译到第十六章, 还在翻译中。。。。。。。。。。
注1:《Rust Cookbook 中文版》翻译自 rust-lang-nursery 团队撰写的 "A Rust Cookbook",感谢 rust-lang-nursery 团队的无私奉献!注2:《Rust Cookbook 中文版》计划为两个阶段:第一阶段:经仔细斟酌,形成专业、...
Rust 核心库和标准库中文翻译,可作为 IDE 工具的智能提示,并生成本地 API 文档