Rust 从可变 self 函数调用可变 self 函数

标签 rust

在下面的示例中,我想为每个 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 selfspin 重用,不存在冲突(事实上否则它不会工作,因为 self.spin 会尝试从不可变借用创建可变借用,这会失败)。

问题在于您正在为 self.smol_sockets.iter_mut() 创建可变借用,并为 self.spin() 创建单独且重叠的借用。

您应该按照 Aloso 的说明通过克隆来避免在可迭代套接字上借用它,或者为可迭代对象提供 spin 索引/键,以便它在内部进行借用。

关于Rust 从可变 self 函数调用可变 self 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63025313/

相关文章:

rust - 为什么可以将带连字符的 crate 名称更改为带下划线的名称,在这种模棱两可的情况下命名规则是什么?

rust - 将代码生成标志添加到 Cargo 构建中

go - gRPC客户端不占用服务器端流

debugging - 如何使用 GDB 或 LLDB 等调试器在 Rust 中调试 crate?

rust - 如何在安全的 Rust 中为非大小类型及其拥有的对应物(如 `str` 和 `String` )创建新类型?

rust - 如何在 Rust 中调用泛型 trait 方法

rust - 如何将 char 转换为整数并在 Rust 中匹配武器?

math - 标准库中是否有返回两个数字中较大或较小的函数?

rust - 如何提供对兄弟结构的引用?

rust - rust `new`方法如何知道要返回的通用结构类型?