我已经实例化了一个结构体 result
并将其作为 mutable ref
传递给另一个函数,该函数用数据填充这个结构体。
之后,我将此结构作为 immutable ref
传递给其他函数,以将数据插入数据库。
let mut result = indexer::IndexRefreshResultHolder {
putlist: Vec::new(),
dellist: Vec::new(),
};
indexer::refresh_indeces(&mut new_idx_set, old_idx_set_opt, &mut result);
pg::delete_index_rows(&mut tx, &result.dellist).await?;
pg::insert_index_rows(&mut tx, &result.putlist).await?;
refresh_indeces 的签名如下:
pub fn refresh_indeces<'a>(
new_idx: &'a mut IndexSet,
old_idx_opt: Option<&'a mut IndexSet>,
result: &'a mut IndexRefreshResultHolder<'a>,
) -> Result<(), AppError>
该函数从 new_idx
和 old_idx
获取数据并将其合并到 result
中。
编译错误:
cannot borrow 'result.dellist' as immutable because it is also borrowed as mutable
。 'result.putlist' 也一样。
我明白,由于结构从 mutable borrowed
到 refresh_indeces
,因此无法确定,之后数据会发生变化。
我现在的问题是:“我怎样才能让编译器理解,在调用 result
后 refresh_indeces
不会改变”或者换句话说:“result
如何作为immutable ref
再次作为 mutable ref
传递一次?
感谢您的帮助。
答案 0 :(得分:0)
只需使用一个新的范围,这样 &mut
就会在需要使用其他引用之前被删除:
let mut result = indexer::IndexRefreshResultHolder {
putlist: Vec::new(),
dellist: Vec::new(),
};
{
indexer::refresh_indeces(&mut new_idx_set, old_idx_set_opt, &mut result);
}
pg::delete_index_rows(&mut tx, &result.dellist).await?;
pg::insert_index_rows(&mut tx, &result.putlist).await?;
编辑:实际上您的生命周期是错误的,因为它们强制延长 &mut
的生命周期。您可以将它们分开:
fn refresh_indeces<'a, 'b, 'c>(
new_idx: &'a mut IndexSet,
old_idx_opt: Option<&'a mut IndexSet>,
result: &'b mut IndexRefreshResultHolder<'a>,
) -> Result<(), std::io::Error>
此外,您正在 Playground 中创建一些需要修复的临时引用。在那之后,另一批关于所有权的修复也会出现
答案 1 :(得分:-1)
通过替换切片解决:
result.dellist.extend(old_idx.rows[i_old..].to_vec().iter());
带有迭代器:
for row in old_idx.rows.iter().skip(i_old) {
result.dellist.push(row);
}