Rust 为什么不使用“展开”选项移动该值?

Rust 为什么不使用“展开”选项移动该值?,rust,move,Rust,Move,新来的锈在这里,并试图学习。考虑下面的代码: let x = Some("air"); println!("{}", x.unwrap()); println!("{}", x.unwrap()); 为什么这样做有效?因为unwrap方法具有以下签名pub fn unwrap(self)->T,所以它应该将self移动到方法中,这意味着在第一次调用x.unwrap之后,我应该不能再访问x。然而,这仍然有效?有人能解释一下我在这里的误解吗?使用unwrap()方法从所选元素中移除父元素,而不是元

新来的锈在这里,并试图学习。考虑下面的代码:

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'被删除。

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


假设
Y
是'X'的父对象,而'Z'是'Y'的父对象,那么当你说
X.unwrap()
X的父对象'Y'被删除,而'Z'成为'X'的父对象,而现在当你说
X.unwrap()
时,则'Z'被删除。

刚刚明白,OP中的
x
不会移动,因为
选项实现了
复制
特性。另一方面,如果选项中的内部类型是更复杂的类型,例如
struct
,则这将不起作用:

struct Node<T> { elem: T }

let y = Some(Node { elem: 3});

println!("{}", y.unwrap().elem);
println!("{}", y.unwrap().elem);

刚刚计算出,
x
在OP中没有移动,因为
选项实现了
Copy
特性。另一方面,如果选项中的内部类型是更复杂的类型,例如
struct
,则这将不起作用:

struct Node<T> { elem: T }

let y = Some(Node { elem: 3});

println!("{}", y.unwrap().elem);
println!("{}", y.unwrap().elem);

您将
&str
字符串
混淆,后者不是
复制

fn main(){
//这很好用。
设x=一些(“数据”);
println!(“{:?}”,x.unwrap());
println!(“{:?}”,x.unwrap());
//但是,这将生成一个错误,因为值将被移动。
设x=Some(“data.to_string());
println!(“{:?}”,x.unwrap());
println!(“{:?}”,x.unwrap());
}

您将
&str
字符串
混淆,后者不是
复制

fn main(){
//这很好用。
设x=一些(“数据”);
println!(“{:?}”,x.unwrap());
println!(“{:?}”,x.unwrap());
//但是,这将生成一个错误,因为值将被移动。
设x=Some(“data.to_string());
println!(“{:?}”,x.unwrap());
println!(“{:?}”,x.unwrap());
}

x
选项
,而不是
选项
<代码>选项
未实现
复制
@SCappella感谢您的澄清。更新
x
选项
,而不是
选项
<代码>选项
未实现
复制
@SCappella感谢您的澄清。更新!回答得好。谢谢回答得好。谢谢本例中的“父元素”是什么?本例中的“父元素”是什么?