在下面的示例中,我想为每个 smol_socket_handle
调用 spin
,这只是一个 usize
。
pub fn spin_all(&mut self) -> u8 {
for (smol_socket_handle, _) in self.smol_sockets.iter_mut() {
self.spin(smol_socket_handle.clone());
}
0
}
pub fn spin(&mut self, smol_socket_handle: usize) -> u8 {
问题是我两次借用 self
作为可变的。当调用 spin_all
时一次,当我们调用 spin
时再次。我绝对需要 spin
来处理 &mut self
。如何让 spin_all
为可变的 self
多次调用 spin
?
更新:
如果我理解正确的话,
for (smol_socket_handle, smol_socket) in self.smol_sockets.iter_mut() {
self.spin(smol_socket_handle.clone());
}
扩展为
{
//borrows self mutably
let mut _iter = std::iter::IntoIterator::into_iter(self.smol_sockets.iter_mut());
loop {
match _iter.next() {
Some(loop_variable) => {
//tries to borrow self mutably again while it's still borrowed into `_iter`
self.spin(loop_variable.clone());
},
None => break,
}
}
}
?
最佳答案
The problem is that I borrow self as mutable twice. Once when spin_all is called, and once again when we call spin.
不,这不是问题。 spin_all 的可变 &mut self
被 spin
重用,不存在冲突(事实上否则它不会工作,因为 self.spin
会尝试从不可变借用创建可变借用,这会失败)。
问题在于您正在为 self.smol_sockets.iter_mut()
创建可变借用,并为 self.spin()
创建单独且重叠的借用。
您应该按照 Aloso 的说明通过克隆来避免在可迭代套接字上借用它,或者为可迭代对象提供 spin
索引/键,以便它在内部进行借用。
关于Rust 从可变 self 函数调用可变 self 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63025313/