在这里生锈并尝试学习的新手。考虑以下代码:
let x = Some("air");
println!("{}", x.unwrap());
println!("{}", x.unwrap());
为什么这样做?由于unwrap
方法具有以下签名pub fn unwrap(self) -> T
,因此应将self
移入该方法,这意味着在首次调用x.unwrap
之后,我将无法再访问x
。但是,这仍然有效吗?有人可以解释我在这里误会什么吗?
unwrap()
方法用于从所选元素而不是元素本身中删除父元素。
让我们说Y
是'X'的父级,而'Z'是'Y'的父级,那么当您说x.unwrap()
X的父级'Y'被删除,'Z'成为'X'的父级时,现在当您再次说x.unwrap()
时,将删除“ Z”。
只需弄清楚,OP中的x
不会移动,因为Option<String>
实现了Copy
特性。另一方面,如果选项中的内部类型是更复杂的类型,例如struct
,则将无法使用:
struct Node<T> { elem: T }
let y = Some(Node { elem: 3});
println!("{}", y.unwrap().elem);
println!("{}", y.unwrap().elem);
将出现以下错误:
Line 33, Char 24: use of moved value: `y` (solution.rs) | 32 | println!("{}", y.unwrap().elem); | - value moved here 33 | println!("{}", y.unwrap().elem); | ^ value used here after move |