Rust 综合了已经出现的一些语言的优点并借鉴了其中的一些语法,所以如果有 C++/ECMAScript/Python/Golang 等语言实践基础后在来看 Rust 时,总能在其中发现一些其他语言的影子。但是 Rust 还是有很多创新的地方,例如编译时最常出现的 “Value borrowed here after move” 。
结构体可以将相关的属性封装到一个统一的数据类型中。在 Rust 中,结构体有三种变体:
- C-like structs
- 一个或多个逗号分隔的 name:value
- 使用大括号内括列表
- 类似于 OOP 语言中的类
- 因为字段有名称,所以可以通过点来访问内部成员
- Unit structs
- 完全没有成员的结构
- 定义了一个新类型,类似于一个空元组
- 在泛型中经常用到
- Tuple structs
- 通过逗号分隔值
- 带括号的列表
- 看起来像一个命名元组
这种情况下的 struct 与 Golang 的结构体在使用上几乎相同。
struct Color {
red: u8,
green: u8,
blue: u8,
}
fn main() {
let purple = Color {
red: 128,
green: 0,
blue: 128,
};
println!(
"Purple = rgb({},{},{})",
purple.red, purple.green, purple.blue
);
}
0x02 Unit structs
类似于 Golang 中经典的 struct{}{} 一个空结构体的实例化,可以在很多需要一个数据进行填充的情况下使用。Rust 允许空结构体定义,即一个没有实际成员的结构体被定义。当用于实现不同的 Trait 时,变得非常有用。
struct Electron;
fn main() {
let x = Electron;
}
0x03 Tuple structs
tuple-structs 是 Rust 对于 struct 关键字的一个创新,可以将 tuple-structs 理解为非匿名的 tuple。
struct Color(u8, u8, u8);
fn main() {
let purple = Color(128, 0, 128);
let Color(r, g, b) = purple;
println!("Purple = rgb({},{},{})", r, g, b);
}
特别地,当元组结构只有一个元素时,我们称之为 newtype pattern。通过解构赋值的方式来实现类型别名之间的转换。
struct Kilometers(i32);
fn main() {
let distance = Kilometers(20);
let Kilometers(distance_in_km) = distance;
println!("The distance: {} km", distance_in_km);
}
参考文档
- https://learning-rust.github.io/docs/b2.structs.html
- 如何理解rust的tuple struct



