空值处理
我们对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)
和None
。Some
是一个元组风格的变体:它保存了未命名的字段。
元组风格的变体常用于需要存储单个字段的场合,尤其是当我们面对像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