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>