在Rust中需要两次借用时使用什么设计模式?

qxgroojn  于 2022-12-19  发布在  其他
关注(0)|答案(1)|浏览(132)

这是一个生 rust 函数。

impl Room {
  pub fn getPageContent(&mut self, bookNumber: u32, pageNumber: u16, alp: &Alphabet) {
    let page = &mut self.books[(bookNumber-1) as usize].pages[(pageNumber-1) as usize];
    if page.text.is_empty() {
      page.generateContent(alp, bookNumber, &self);
    }
  }
}

每个页面都需要从到房间的信息来生成它的内容。然而,如函数所示,这样做当然会导致

cannot borrow `self` as immutable because it is also borrowed as mutable´

我的问题是:在这种情况下,设计模式应该是什么样的?2特别是在规模上,因为这只是一个例子。
如果所有这些信息都实现了克隆,那么从房间中为页面提供所需的每个信息将是一个解决方案,但似乎并不可取(如果“generateContent”需要10个不同的信息呢?这种模式将迅速增加要完成的工作,沿着潜在的错误和整体复杂性)。
另一种解决方案是直接在"getPageContent“中生成内容,但这种模式会很快导致 * 所有事情 * 都在Room中完成,这在大规模应用时似乎也不是一个好主意。

5vf7fwbs

5vf7fwbs1#

您可以从generateContent中取出突变,然后更改generateContent以获取非mut参考。

pub fn get_page_content(&mut self, book_number: u32, page_number: u16, alp: &Alphabet) {
    let page = &self.books[(book_number - 1) as usize].pages[(page_number - 1) as usize];
    if page.text.is_empty() {
        let text = page.generate_content(alp, book_number, self);

        // lookup the page again but mut this time
        let page =
            &mut self.books[(book_number - 1) as usize].pages[(page_number - 1) as usize];
        page.text = text;
    }
}

相关问题