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感谢您的澄清。更新!回答得好。谢谢回答得好。谢谢本例中的“父元素”是什么?本例中的“父元素”是什么?