当你在Rust中需要两个借用时,使用什么设计模式?



这是一个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´

我的问题是:在这种情况下使用的预期设计模式是什么?尤其是在规模上,因为这只是一个例子。

如果所有这些信息都实现了克隆,那么给页面提供它需要的来自Room的每个信息将是一个解决方案,但似乎不明智(如果"generateContent"需要10个不同的信息怎么办?这样的模式会迅速增加要完成的工作,同时还会带来潜在的错误和总体的复杂性)。

另一个解决方案是直接在' getPageContent '中生成内容,但是这种模式会很快导致所有都在Room中完成,当大规模应用时,这似乎也不是一个好主意。

您可以将突变从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;
}
}

最新更新