所以我有一个set_next
函数,它接受对self的可变引用。我想在函数的末尾返回一个对self的不可变引用,因为我认为列表在实现的函数之外不应该是可变的。但是,当我尝试返回self时,我得到了以下错误:
mismatched types
expected struct `DoublyNode<T>`
found mutable reference `&mut DoublyNode<T>`
下面是代码:
struct DoublyNode<T> {
previous: Box<Option<DoublyNode<T>>>,
next: Box<Option<DoublyNode<T>>>,
value: T
}
impl<T> DoublyNode<T> {
pub fn new(
previous: Option<DoublyNode<T>>,
next: Option<DoublyNode<T>>,
value: T
) -> Self {
DoublyNode { previous: Box::new(previous), next: Box::new(next), value }
}
fn set_next(&mut self, next_node: Option<DoublyNode<T>>) -> Self {
self.next = Box::new(next_node);
self
}
}
我尝试返回*self
,但它没有实现Copy
的特性。是否为DoublyNode
实现Copy
trait的正确解决方案?
1条答案
按热度按时间huus2vyu1#
所以我有一个set_next函数,它接受对self的可变引用。我想在函数的末尾返回一个对self的不可变引用
有可能...
...但是你的代码并没有说你返回一个不可变的引用,它说你返回
Self
* by value *。你应该写的函数签名是:使用
&Self
,一个不可变的引用,而不是Self
。有了这些更改,代码将编译。请注意,这可能会让您失望。从可变引用生成的不可变引用仍然保持可变借用的活动,因此您不能以您希望的所有方式使用它-特别是您不能在拥有它的时候使用节点的其他借用。(不,这不是 * 简单 * 借用检查器的缺陷;在某些情况下,由于借款的原始来源依赖于排他性,因此这一规则对稳健性很重要,例如:
Cell::get_mut()
。您需要更改语言以引入一种新的、不同类型的可变引用。此外,正如已经提到的,在Rust中实现双向链表是困难的,而且往往不切实际,你应该通过Learning Rust With Entirely Too Many Linked Lists来工作-它不仅会教你如何解决你将要遇到的问题,它也是一个很好的方法来更多地了解在Rust中设计数据结构。