你不想要null。 null 是一个不安全的反模式,即使在你必须使用它的语言中,幸好 Rust 让我们摆脱了暴行。 Box<T>总是包含T,从不null。 Rust 没有null 的概念。
正如您正确指出的那样,如果您希望某个值是可选的,请使用Option<T>。不管你是Box<Option<T>> 还是Option<Box<T>> 都没有那么重要,对底层事物有更多了解的人可以指出哪个更有效。
struct Node {
value: i32,
next: Option<Box<Node>>,
}
struct Stack {
top: Option<Box<Node>>,
}
Option 说“这可能存在也可能不存在”,Box 说“这个值在堆上。现在,Option 的优点在于它比null 好得多你必须检查它。你不能忘记,否则编译器会抱怨。这样做的典型方法是使用match
match my_stack.top {
None => {
// Top of stack is not present
}
Some(x) => {
// Top of stack exists, and its value is x of type Box<T>
}
}
Option 类型本身上有tons of helper methods,用于处理常见模式。以下只是我使用的一些最常见的。请注意,所有这些都可以用match 来实现,并且只是便利功能。
以下Java代码的等价物
if (value == null) {
result = null;
} else {
result = ...;
}
是
let result = value.map(|v| ...)
或者,如果内部计算也可以产生None,
let result = value.and_then(|v| ...)
如果你想提供一个默认值,比如零,比如
if (value == null) {
result = 0;
} else {
result = value;
}
那你想要
result = value.unwrap_or(0)
最好停止思考如何处理null,从头开始学习Option<T>。一旦掌握了窍门,它就会比null 检查更安全、更符合人体工学十倍。