当前位置: 首页 > 知识库问答 >
问题:

rust 所有权的问题?

皇甫宇定
2024-01-08
  struct Animate {    name: String  }  impl Animate {    fn get_name(&self) -> String {      return self.name;    }  }  let animate = Animate {    name: String::from("dog")  };  println!("{}", animate.get_name());

如果运行上面的程序,会报错误

cannot move out of `self.name` which is behind a shared reference

修复的方法可以是

fn get_name(&self) -> &String {      return &self.name;    }或者是fn get_name(&self) -> String {      return self.name.clone();    }

这个问题应该是和 rust 所有权有关,当方法返回时会出现所有权移动。一开始认为可能是结构体内的字段无法移动所有权。但是执行

let a_name = animate.name;// println!("{}", animate.name) 报错了// println!("{}", a_name) 没有问题

报错的原因应该是所有权移动后, animate.name 就失效了,按这么说结构体内的字段是可以移动所有权的。

那最上面的报错应该怎么比较好去理解?

共有3个答案

程正阳
2024-01-08

其实很简单 因为你get_name没有取得animate的所有权,所以不能直接move,你只能返回&str或者Copy(这样可以保证后续继续可以调用get_name)
你把&self改成self 就能move了, 但是后续也无法继续使用animate

商松
2024-01-08

rust 中结构体是一个容器,这个容器里的元素可能在这个容器里,但如果你想使用容器里的元素,需要把这些元素在容器中取出来,即所有权的变化。

struct Animate {  name: String}impl Animate {  fn get_name(&self) -> String {    return self.name;  // 元素从容器中取了出来,容器里就没有这个元素了  }}let a_name = animate.name; // 元素从容器中取了出来,容器里就没有这个元素了

如果在使用时不想在容器中取元素后发生所有权转移,就需要使用引用,意思是,我引用你容器里的元素,元素还在容器里,不需要移动。

    fn get_name(&self) -> &str {      return &self.name;  // 获取容器内元素的引用,而不是直接取元素,则不会发生容器内元素的所有权转移    }    fn get_name(&self) -> String {      return self.name.clone(); // 获取容器内元素的复制体,而不是直接取元素,则不会发生容器内元素的所有权转移    }let a_name = animate.name.as_str(); // 获取容器内元素的引用,而不是直接取元素,则不会发生容器内元素的所有权转移

这是 rust 的特性之一,需要适应一段时间。

孔斌
2024-01-08

并不是结构体成员不能 move 。

你的成员函数里,self 是一个 reference 。reference 并没有所有权,所以也就无法发生所有权移动。

 类似资料:
  • 在代码中线获取文件的行数,之后又进行了文件内容的遍历,但产生了问题,如下 请问各位大佬如何解决

  • Rust 的核心功能(之一)是 所有权(ownership)。虽然这个功能说明起来很直观,不过它对语言的其余部分有着更深层的含义。 所有程序都必须管理其运行时使用计算机内存的方式。一些语言中使用垃圾回收在程序运行过程中来时刻寻找不再被使用的内存;在另一些语言中,程序员必须亲自分配和释放内存。Rust 则选择了第三种方式:内存被一个所有权系统管理,它拥有一系列的规则使编译器在编译时进行检查。任何所有

  • 这篇教程是现行 3 个 Rust 所有权系统章节的第一部分。所有权系统是Rust最独特且最引人入胜的特性之一,也是作为 Rust 开发者应该熟悉的。Rust 所追求最大的目标 -- 内存安全,关键在于所有权。所有权系统有一些不同的概念,每个概念独自成章: 所有权,你正在阅读的这个章节 借用,以及它关联的特性: "引用" (references) 生命周期,关于借用的高级概念 这3章依次互相关联,你

  • 所有权(系统)是 Rust 最独特的功能,其令 Rust 无需垃圾回收(garbage collector)即可保障内存安全。因此,理解 Rust 中所有权如何工作是十分重要的。本章我们将讲到所有权以及相关功能:借用、slice 以及 Rust 如何在内存中布局数据。

  • 有三种处理自由代码和文档版权所有权的方法,许多人为此做出了贡献。第一种是完全无视版权的问题(我不建议如此)。第二种方法是从项目中工作的每个人那里收集一个贡献者许可证协议(CLA),明确项目对使用个人贡献的权利。这通常对大多数项目已经足够了,更好的是在一些司法权中,CLA是可以通过email发送的。第三种方法是从贡献者那里获得真正的版权协议,这样项目(例如一些法律实体,通常是非盈利)就是所有东西的版

  • 删除这里在前面的线程中是可以循环send消息的 求大佬帮助! 这里不管怎么改调用send 1.在这里Arc::clone试过不行 2.sleep一会儿还是不行 刚开始学,rust有点难,还没入门提的问题可能有点弱鸡,望各位大佬能提点一下