Rust 借用检查器错误:“无法将 *self 借用为可变的,因为它也借用为不可变的”

问题描述 投票:0回答:1

我正在开发一个 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<(), ()> {

我尝试过的事情

  1. 将行收集到向量:我尝试将 self.content.lines() 收集到 Vec 中,然后迭代该向量,但错误仍然存在。

  2. 按索引访问行:我尝试在循环中使用 self.content.lines().nth(line_number) 以避免在 self 上借用迭代器。然而,这个解决方案似乎效率低下,尤其是对于较大的内容,而且我仍然遇到问题。

如何解决 Rust 中的这种借用冲突?理想情况下,我想迭代 self.content,同时允许在 handle_character 内对 self 进行可变访问,而不会遇到借用检查器错误。

任何有关有效解决方案或替代方法的见解将不胜感激!

rust
1个回答
0
投票

假设

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
放回去!

© www.soinside.com 2019 - 2024. All rights reserved.