为什么我可以调用多个消耗self的Option方法而不会出错


let option: Option<&str> = None;
// -- unwrap --
let unwrap = panic::catch_unwind(|| option.unwrap());
assert!(unwrap.is_err());
let unwrap_or_default = option.unwrap_or_default();
assert!(unwrap_or_default == "");
let unwrap_or = option.unwrap_or("👌");
assert!(unwrap_or == "👌");
let unwrap_or_else = option.unwrap_or_else(|| "🙌");
assert!(unwrap_or_else == "🙌");

游乐场

方法Option::unwrap_xxx(self) -> T都使用self,那么为什么我们可以重复调用这些方法而不会出现编译错误呢?Option没有移动吗?

Rust具有Copy特性,通常用于存储在堆栈上的小值,如i32bool和引用。如果一个类型实现Copy,它将被复制,而不是移动。引用这本书:

如果一个类型实现了Copy特征,则一个变量在赋值给另一个变量后仍然有效。

当将变量传递到函数中时,同样适用。变量将保持有效,因为它是被复制的,而不是被移动的。

Copy的存在主要是由于人体工程学的原因(否则需要过于频繁地使用明确的.clone()(。相应地,Option<T>实现Copy,而T实现Copy

相关内容

最新更新