微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

结构所有权

如何解决结构所有权

struct Haha {
    pub a: u32,pub b: Vec<u32>,}
let example = Haha {
    a: 32,b: vec![1],}; 
let new_a = example.a;
let new_b = example.b;

我的理解是:

  1. new_aexample.a的副本,因此example仍然拥有example.a
  2. new_b被移动以来,
  3. example.b现在拥有example.b

由于具有example.a特征,锈会隐式复制copy吗?并且由于example.bVec,没有实现copy特征,因此example.b的所有权是移动的而不是被复制的?

解决方法

您的理解是正确的。 a在移动b时被复制。您可以通过尝试随后访问两个字段来确认。

println!("{:?}",example.a);

这将打印32example.a仍可访问,因为它已被复制而不是移动。

println!("{:?}",example.b);

访问example.b失败,并显示错误消息:

error[E0382]: borrow of moved value: `example.b`
  --> src/main.rs:13:22
   |
12 |     let _new_b = example.b;
   |                  --------- value moved here
13 |     println!("{:?}",example.b);
   |                      ^^^^^^^^^ value borrowed here after move
   |
   = note: move occurs because `example.b` has type `std::vec::Vec<u32>`,which does not implement the `Copy` trait

这完全确认了您的发言,example.b之所以被感动是因为它没有实现Copy特质。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。