在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循环
  • 使函数可变,该错误现在表明不允许两个可变引用。我猜错误消息的整个“不变性”部分实际上是不相关的。

我也许可以将iterable的全部内容复制到vector或此类向量中,但这会破坏迭代器的目的,如果迭代器不是有限的,该怎么办?必须有更好的方法对...

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

艾伦·达玛萨普特拉(Alan Darmasaputra)

如果在同一个块中存在结构的不可变引用时,希望结构的属性可变,则需要RefCell这称为内部可变性

如果需要内部可变性struct 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) {

    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章