» Rust快速入门 » 1. 基础篇 » 1.4 自定义类型

自定义类型

结构体

有三种类型的结构体。

// 一个元组结构体
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有两种不同类型的常量:conststatic

  • 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...
> 此处输出代码运行结果
上页
下页