自定义类型
结构体
有三种类型的结构体。
- 元组结构体
- C 结构体
- Unit 单元结构体
// 一个元组结构体
struct Point(f64, f64);
let point = Point(0.5, 0.6);
// 一个C结构体
struct Person {
id: u32,
name: String,
}
let name = String::from("Jerry");
let id = 5678;
let jerry = Person { id, name }; // Person { id: 5678, name: "Jerry" }
// 一个单元结构体,没有字段。
struct Unit;
// 在泛型代码中,类型的行为取决于它是否实现了某个特征 trait,而不是其持有的数据
trait SomeTrait {
// 特征方法 ...
}
impl SomeTrait for Unit {
// implementations
}
枚举
一种可以是其多个变体之一的类型。 Rust 中的枚举与其他编译型语言(如C)中的枚举相似,但又比它们更强大。
enum WebEvent {
PageLoad,
PageUnload,
KeyPress(char),
Paste(String),
Click { x:f64, y:f64 },
}
fn inspect(event: WebEvent) {
match event {
WebEvent::PageLoad => println!("page loaded"),
WebEvent::PageUnload => println!("page unloaded"),
// 从`enum`变体内部解构`c`。
WebEvent::KeyPress(c) => println!("pressed '{}'.", c),
// 从`enum`变体内部解构`s`。
WebEvent::Paste(s) => println!("pasted \"{}\".", s),
// 将`Click`解构为`x`和`y`。
WebEvent::Click { x, y } => {
println!("clicked at x={}, y={}.", x, y);
},
}
}
类型别名
如果枚举的名称太长或太通用,可以为其取一个别名。
enum SuperLongEnumWithALotOfStuff {
Merge,
Split,
...
}
type Operation = SuperLongEnumWithALotOfStuff;
// 通过其别名访问枚举变体
let a = Operation::Merge;
经典的 C 风格枚举
// 具有显式区分值的枚举
enum Color {
R = 0xff0000,
G = 0x00ff00,
B = 0x0000ff,
}
fn main() {
println!("roses are #{:06x}", Color::R as i32); // roses are #ff0000
println!("violets are #{:06x}", Color::B as i32); // violets are #0000ff
}
:06x
表示十六进制输出,补零(zero-padding)到 6 个位置。
常量
Rust有两种不同类型的常量:const
和 static
。
const
: 一个在编译时必须求值的不可变值static
: 一个可能可变的量。其可变性取决于是否有mut
关键字。访问或修改可变静态变量都是unsafe
的。
// 在编译时必须求值的不可变值
const MAX_COUNT: u32 = 100;
static DOMAIN: &str = "literank.com";
// 如果值可以在运行时更改并且需要在全局共享,使用 `static`。
static mut INITIALIZED: bool = false;
fn initialize_once() {
unsafe {
if !INITIALIZED {
// 初始化逻辑
INITIALIZED = true;
}
}
}
代码挑战
尝试修改编辑器中提供的代码以计算
Rectangle
面积。
Loading...
> 此处输出代码运行结果