空值处理

我们对assigned方法的实现相当直接:对于待办和已完成的票证采用恐慌处理远非理想。通过使用Rust的Option类型,我们可以做得更好。

Option

Option是Rust中表示可空值的类型。它是Rust标准库中定义的一个枚举:

#![allow(unused)]
fn main() {
enum Option<T> {
    Some(T),
    None,
}
}

Option编码了值可能存在(Some(T))或不存在(None)的概念。它还强制你明确处理两种情况。如果你在处理可空值时忘记处理None情况,编译器会报错。这相比其他语言中“隐式”的空值处理是一个显著改进,在那些语言中,你可能会忘记检查null从而触发运行时错误。

Option的定义

Option的定义使用了一个你之前未见过的Rust结构:元组风格的变体

元组风格的变体

Option有两个变体:Some(T)NoneSome是一个元组风格的变体:它保存了未命名的字段

元组风格的变体常用于需要存储单个字段的场合,尤其是当我们面对像Option这样的“包装”类型时。

元组风格的结构体

它们不仅限于枚举——你也可以定义元组风格的结构体:

#![allow(unused)]
fn main() {
struct Point(i32, i32);
}

然后你可以通过位置索引来访问Point实例的两个字段:

#![allow(unused)]
fn main() {
let point = Point(3, 4);
let x = point.0;
let y = point.1;
}

元组

在还未见过元组的情况下就说某物像元组可能听起来有些奇怪!元组是Rust的基本类型。它们组合了一定数量的值,这些值可能具有(也可能不具有)不同的类型:

#![allow(unused)]
fn main() {
// 两个值,相同类型
let first: (i32, i32) = (3, 4);
// 三个值,不同类型
let second: (i32, u32, u8) = (-42, 3, 8);
}

语法很简单:你只需要在括号间列出类型,用逗号分隔。你可以使用点符号和字段索引来访问元组的字段:

#![allow(unused)]
fn main() {
assert_eq!(second.0, -42);
assert_eq!(second.1, 3);
assert_eq!(second.2, 8);
}

当你懒得定义一个专用的结构体类型时,元组是将值组合在一起的一种便捷方式。

参考资料

  • 本节的练习位于 exercises/05_ticket_v2/05_nullability