gpt4 book ai didi

rust - 如何在 Rust 中迭代时调用方法

转载 作者:行者123 更新时间:2023-12-03 11:25:02 24 4
gpt4 key购买 nike

如果这很简单,请道歉。我正在学习 Rust 并习惯了奇怪的借阅系统。通常,您可以通过更改方法调用的语法来获得所需的行为,但是,在这种情况下,现在似乎有办法。

我的代码的简化版本是这样的:EventPump如果来自 SDL。

struct Example {
pump: EventPump
}

impl Example {
fn method(&mut self) {
for event in pump.poll_iter() {
self.other_method();
}
}

fn other_method(&self) {

}
}

但是,我收到以下错误:
error[E0502]: cannot borrow `*self` as immutable because it is also borrowed as mutable
--> src\game.rs:53:67
|
30 | for event in self.pump.poll_iter();
| ---------------------
| |
| mutable borrow occurs here
| mutable borrow later used here
...
53 | self.other_method();
| ^^^^ immutable borrow occurs here

可能有一些正确的方法可以做到这一点,因此我的结构可以保持自己的所有权,但我一直找不到它。

我尝试了以下方法:
  • 使用显式 while let event = iterator.next() 将其转换为 while 循环,同样的错误
  • 使函数可变,错误现在说也不允许有两个可变引用。我想错误消息的整个“不变性”部分实际上是无关紧要的。

  • 我也许可以将迭代器的全部内容复制到一个向量中,但这会破坏迭代器的目的,如果迭代器不是有限的呢?必须有更好的方法对...

    如果有更多防 rust 经验的人可以帮助我,我将不胜感激。

    最佳答案

    如果在同一块中存在结构的不可变引用时,您希望结构的属性是可变的,则需要 RefCell .这叫做interior mutability .

    如果 interior mutabilitystruct Example是需要的,那么您将需要一个 RefCell .

    use sdl2::{EventPump};

    struct Example {
    pump: RefCell<EventPump> // wrap in RefCell
    }

    impl Example {
    // you have to decide whether you want a mutable or immutable chained methods
    // i.e. method and other_method should be of same mutability because
    // other method is called in method
    fn method(&self) {
    // borrow a mutable reference of pump inside a method with immutable self
    let mut pump = self.pump.borrow_mut();
    for event in pump.poll_iter() {
    self.other_method();
    }
    }

    fn other_method(&self) {

    }
    }

    关于rust - 如何在 Rust 中迭代时调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60465770/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com