gpt4 book ai didi

compiler-errors - Rust 借用编译错误

转载 作者:行者123 更新时间:2023-11-29 08:16:41 25 4
gpt4 key购买 nike

我正在尝试通过编写一个简单的词法分析器来学习 Rust。这是我到目前为止所拥有的...

use std::fs::File;
use std::io::Read;
use std::str::Chars;

pub struct Lexer<'a> {
file_name: String,
file_contents: String,
iterator: Option<Chars<'a>>,
}

impl<'a> Lexer<'a> {

fn new(fname: &str) -> Lexer {
Lexer {
file_name: fname.to_string(),
file_contents: String::new(),
iterator: None,
}
}


// Reads the file contents and creates iterator
fn init(&'a mut self) {

// Open the file
let mut f = File::open(&self.file_name).expect("Couldn't open file");

// Read the contents
f.read_to_string(&mut self.file_contents).expect("Couldn't read file contents");

self.iterator = Some(self.file_contents.chars());

}

// Gets the next character
fn get_next(&mut self) -> Option<char> {

self.iterator.unwrap().next()

}

}

fn main() {

let mut lexer = Lexer::new("test.txt");
lexer.init();

// Assuming the file "text.txt" contains "Hello World"
// then the following two lines should print "H" then "e"

println!("{}", lexer.get_next().unwrap());
println!("{}", lexer.get_next().unwrap());

}

然而,当我尝试编译它时,出现以下两个错误:

cannot move out of borrowed content [E0507]
main.rs:38 self.iterator.unwrap().next()

cannot borrow `lexer` as mutable more than once at a time [E0499]
main.rs:49 println!("{}", lexer.get_next().unwrap());

第一个错误的谷歌显示 Clone()-ing 是解决此类错误的可能方法,但我相信这在这种情况下不起作用,因为迭代器状态需要每次调用 next() 时更新。

有没有人对如何克服这些问题并使其编译有任何建议?

最佳答案

最终,您正在尝试 store a value and a reference to that value in the same struct .与其他公式不同,这个特定 案例允许您“打结”引用,但可能不会按照您的意愿行事。例如,在调用 init 之后,您将永远无法移动 Lexer,因为移动它会使引用无效。

它还解释了“再次借用”错误。因为生命周期应用于自身,并且它是一个可变引用,词法分析器本身将永远保留可变引用,这意味着没有其他任何东西可以改变它,包括它自己。

简短的回答是:不要以这种方式组织代码。无论出于何种原因,解析和词法分析都是 Rust 社区中的一个流行问题。查看其他图书馆是如何做到的。

或者查看迭代器的一般工作原理。被迭代的项目保留在原地,并返回一个引用原始项目的单独迭代器。

将您的代码分成相同的两部分可能是最好的方向。

关于compiler-errors - Rust 借用编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38193085/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com