我正在开发一个 Rust 函数,它可以扫描字符串的行并处理每个字符。下面的代码尝试迭代 self.content 的行,并对每个字符调用可变函数 self.handle_character 。但是,我遇到了借用检查器错误:
不能借用 *self 作为可变的,因为它也被借用为 不可变
pub fn run_scanner(&mut self) {
for (line_number, line) in self.content.lines().enumerate() {
let mut chars = line.chars();
while let Some(character) = chars.next() {
match self.handle_character(&character, &mut chars, line_number) {
Ok(_) => {},
Err(_) => break
}
}
}
}
fn handle_character(&mut self, current_char: &char, chars: &mut Chars, line_number: usize) -> Result<(), ()> {
我尝试过的事情
将行收集到向量:我尝试将 self.content.lines() 收集到 Vec 中,然后迭代该向量,但错误仍然存在。
按索引访问行:我尝试在循环中使用 self.content.lines().nth(line_number) 以避免在 self 上借用迭代器。然而,这个解决方案似乎效率低下,尤其是对于较大的内容,而且我仍然遇到问题。
如何解决 Rust 中的这种借用冲突?理想情况下,我想迭代 self.content,同时允许在 handle_character 内对 self 进行可变访问,而不会遇到借用检查器错误。
任何有关有效解决方案或替代方法的见解将不胜感激!
假设
self.content
是一个String
,并且假设handle_character
不需要直接访问self.content
,那么你可以在处理时将self.content
从self
中取出,然后再放回去:
pub fn run_scanner (&mut self) {
let content = std::mem::take (&mut self.content);
for (line_number, line) in content.lines().enumerate() {
let mut chars = line.chars();
while let Some (character) = chars.next() {
match self.handle_character (&character, &mut chars, line_number) {
Ok(_) => {},
Err(_) => break
}
}
}
self.content = content;
}
⚠ 小心,不要在循环中间返回而不将
content
放回去!