rust 结构体返回不可变的ref,同时接受可变引用作为参数

uqdfh47h  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(150)

所以我有一个set_next函数,它接受对self的可变引用。我想在函数的末尾返回一个对self的不可变引用,因为我认为列表在实现的函数之外不应该是可变的。但是,当我尝试返回self时,我得到了以下错误:

  1. mismatched types
  2. expected struct `DoublyNode<T>`
  3. found mutable reference `&mut DoublyNode<T>`

下面是代码:

  1. struct DoublyNode<T> {
  2. previous: Box<Option<DoublyNode<T>>>,
  3. next: Box<Option<DoublyNode<T>>>,
  4. value: T
  5. }
  6. impl<T> DoublyNode<T> {
  7. pub fn new(
  8. previous: Option<DoublyNode<T>>,
  9. next: Option<DoublyNode<T>>,
  10. value: T
  11. ) -> Self {
  12. DoublyNode { previous: Box::new(previous), next: Box::new(next), value }
  13. }
  14. fn set_next(&mut self, next_node: Option<DoublyNode<T>>) -> Self {
  15. self.next = Box::new(next_node);
  16. self
  17. }
  18. }

我尝试返回*self,但它没有实现Copy的特性。是否为DoublyNode实现Copy trait的正确解决方案?

huus2vyu

huus2vyu1#

所以我有一个set_next函数,它接受对self的可变引用。我想在函数的末尾返回一个对self的不可变引用
有可能...

  1. fn set_next(&mut self, next_node: Option<DoublyNode<T>>) -> Self {

...但是你的代码并没有说你返回一个不可变的引用,它说你返回Self * by value *。你应该写的函数签名是:

  1. fn set_next(&mut self, next_node: Option<DoublyNode<T>>) -> &Self {

使用&Self,一个不可变的引用,而不是Self。有了这些更改,代码将编译。
请注意,这可能会让您失望。从可变引用生成的不可变引用仍然保持可变借用的活动,因此您不能以您希望的所有方式使用它-特别是您不能在拥有它的时候使用节点的其他借用。(不,这不是 * 简单 * 借用检查器的缺陷;在某些情况下,由于借款的原始来源依赖于排他性,因此这一规则对稳健性很重要,例如:Cell::get_mut()。您需要更改语言以引入一种新的、不同类型的可变引用。
此外,正如已经提到的,在Rust中实现双向链表是困难的,而且往往不切实际,你应该通过Learning Rust With Entirely Too Many Linked Lists来工作-它不仅会教你如何解决你将要遇到的问题,它也是一个很好的方法来更多地了解在Rust中设计数据结构。

相关问题