Struct 谁拥有结构的所有权';在函数中使用&;自己

Struct 谁拥有结构的所有权';在函数中使用&;自己,struct,rust,ownership,Struct,Rust,Ownership,我正试图围绕VecDeque编写一个小包装 具体来说,我有代码(): 使用std::collections::VecDeque; 特征向量圈{ fn new()->矢量圆; fn find_和_remove(&self,u:T)->选项; } #[导出(调试)] 结构向量圈(VecDeque); VecCircle的impl VecCircleTraits{ fn new()->veccelle{ 返回VecCircle(VecDeque:::new()); } fn查找和删除(&self,键:

我正试图围绕
VecDeque
编写一个小包装

具体来说,我有代码():

使用std::collections::VecDeque;
特征向量圈{
fn new()->矢量圆;
fn find_和_remove(&self,u:T)->选项;
}
#[导出(调试)]
结构向量圈(VecDeque);
VecCircle的impl VecCircleTraits{
fn new()->veccelle{
返回VecCircle(VecDeque:::new());
}
fn查找和删除(&self,键:T)->选项{
让我们将_index:Option=self.0.搜索到_iter().position(| x | x==key);//错误1
如果让一些(索引)=搜索索引{
返回self.0.remove(index);//错误2
}否则{
不返回任何值;
}
}
}
这给了我以下错误:

错误:无法将不可变匿名字段'self.0'借用为可变字段
--> :20:20
|>
20 |>返回self.0.删除(索引);//错误2
|>                    ^^^^^^
错误:无法移出借用的内容[--explain E0507]
--> :18:44
|>
18 |>let search_index:Option=self.0.into_iter().position(| x | x==key)//错误1
|>^^^^无法移出借用的内容

然而,我有点困惑,谁拥有
self.0
?如果我正确理解了文档,那么内存区域是否会被限制为
self.0
,从而赋予它所有权?很抱歉这里的逻辑很肤浅,但我仍在试图理解所有权制度。

查找和删除
中,您在参数列表中指定了
&self
。这意味着该方法将收到一个借来的指向
self
的指针;i、 e.
self
的类型是
&veccirle
。因此,该方法不具有
veccirle
的所有权

find\u and\u remove
尝试调用,而
into\u iter
通过值接收其参数(
self
而不是
&self
&mut self
)。因此,Rust将
self.0
解释为试图将
VecDeque
移出
veccirle
。但是,这是不允许的,因为您不能从借用的内容中移动任何内容,因为从某个位置移动会使该位置无效。但我们不能只告诉打电话的人“嘿,我刚刚使
self
无效,停止使用它!”;如果我们想这样做,我们必须在参数列表中指定
self
,而不是
&self

但这不是你想要做的<代码>进入iter将拥有
VecDeque
,并因此销毁它。还有其他方法可以为
VecDeque
获取迭代器而不破坏它。在这里,我们应该使用,这需要
和self

然后,
查找并删除
尝试调用<代码>删除采用
&mut self
,即对
向量的可变引用
。但是,我们不能将
self.0
作为可变借用,因为
self
本身不是可变借用。我们不能仅仅将不可变借用升级为可变借用:同时使用不可变借用和可变借用是无效的。这里的解决方案是将参数列表中的
&self
更改为
&mut self

use std::collections::VecDeque;

trait VecCircleTraits<T: Eq> {
    fn new() -> VecCircle<T>;
    fn find_and_remove(&mut self, _: &T) -> Option<T>;
}

#[derive(Debug)]
struct VecCircle<T: Eq>(VecDeque<T>);

impl<T: Eq> VecCircleTraits<T> for VecCircle<T> {
    fn new() -> VecCircle<T> {
        return VecCircle(VecDeque::<T>::new());
    }

    fn find_and_remove(&mut self, key: &T) -> Option<T> {
        let search_index: Option<usize> =  self.0.iter().position(|x| x == key);
        if let Some(index) =  search_index {
            self.0.remove(index)
        } else {
            None
        }
    }
}
使用std::collections::VecDeque;
特征向量圈{
fn new()->矢量圆;
fn查找和删除(&mut self,&uu:&T)->选项;
}
#[导出(调试)]
结构向量圈(VecDeque);
VecCircle的impl VecCircleTraits{
fn new()->veccelle{
返回VecCircle(VecDeque:::new());
}
fn查找和删除(&mut self,key:&T)->选项{
让我们搜索索引:Option=self.0.iter().position(|x | x==key);
如果让一些(索引)=搜索索引{
self.0.删除(索引)
}否则{
没有一个
}
}
}

注意:我还将
参数更改为
&T
,以解决另一个错误,这次是在传递到
位置的闭包中。由于
iter
迭代对
VecDeque
中项目的引用,
位置将引用传递给闭包。由于
find\u和
实际上不需要获得密钥的所有权,它应该只接收一个不可变的借来,这样
x
key
都属于
&t
类型,因此我们可以对它们应用
=

,您没有
find\u和\u remove
方法中的
veccirle
的所有权。您只需要知道函数定义:

impl<T: Eq> VecCircleTraits<T> for VecCircle<T> {
    fn find_and_remove(&self, key: T) -> Option<T>
}
也许这更明显

由于您没有
self
的所有权,因此您不能拥有
self.0
的所有权

impl<T: Eq> VecCircleTraits<T> for VecCircle<T> {
    fn find_and_remove(&self, key: T) -> Option<T>
}
fn find_and_remove(self: &VecCircle, key: T) -> Option<T>