为什么不使用选项包装来移动值?

问题描述 投票:0回答:2

在这里生锈并尝试学习的新手。考虑以下代码:

let x = Some("air");
println!("{}", x.unwrap());
println!("{}", x.unwrap());

为什么这样做?由于unwrap方法具有以下签名pub fn unwrap(self) -> T,因此应将self移入该方法,这意味着在首次调用x.unwrap之后,我将无法再访问x。但是,这仍然有效吗?有人可以解释我在这里误会什么吗?

rust move
2个回答
0
投票

unwrap()方法用于从所选元素而不是元素本身中删除父元素。

让我们说Y是'X'的父级,而'Z'是'Y'的父级,那么当您说x.unwrap() X的父级'Y'被删除,'Z'成为'X'的父级时,现在当您再次说x.unwrap()时,将删除“ Z”。


0
投票

只需弄清楚,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
   |
© www.soinside.com 2019 - 2024. All rights reserved.