我刚开始学习Rust,但是在处理生命周期时遇到了困难。
我想要一个包含String的结构体,用于缓冲来自stdin的行。然后,我想要在该结构体上拥有一个方法,该方法返回缓冲区中的下一个字符,或者如果已经使用完该行的所有字符,则从stdin读取下一行。
文档说,Rust字符串不可通过字符索引,因为这对UTF-8效率低下。由于我按顺序访问字符,因此使用迭代器应该没问题。但是,据我所知,Rust中的迭代器与它们正在迭代的内容的生命周期相关联,我无法弄清楚如何将此迭代器存储在结构体中并与String一起使用。
以下是我想要实现的伪Rust代码。显然,它不能编译。
我正尝试完成Synacor challenge。这涉及实现一个虚拟机,其中一个操作码从stdin读取一个字符并将其存储在寄存器中。我已经成功地完成了这部分。文档说明,每当虚拟机内的程序读取一个字符时,它将一直读取,直到读取整行。我想利用这个来添加“保存”命令到我的实现中。这意味着每当程序请求一个字符时,我将从输入中读取一行。如果该行为“save”,我将保存虚拟机的状态,然后继续获取另一行以供虚拟机使用。每次虚拟机执行输入操作码时,我需要能够从缓冲行中逐个字符地提供输入,直到缓冲区耗尽。
我的当前实现在这里。我的计划是将
我想要一个包含String的结构体,用于缓冲来自stdin的行。然后,我想要在该结构体上拥有一个方法,该方法返回缓冲区中的下一个字符,或者如果已经使用完该行的所有字符,则从stdin读取下一行。
文档说,Rust字符串不可通过字符索引,因为这对UTF-8效率低下。由于我按顺序访问字符,因此使用迭代器应该没问题。但是,据我所知,Rust中的迭代器与它们正在迭代的内容的生命周期相关联,我无法弄清楚如何将此迭代器存储在结构体中并与String一起使用。
以下是我想要实现的伪Rust代码。显然,它不能编译。
struct CharGetter {
/* Buffer containing one line of input at a time */
input_buf: String,
/* The position within input_buf of the next character to
* return. This needs a lifetime parameter. */
input_pos: std::str::Chars
}
impl CharGetter {
fn next(&mut self) -> Result<char, io::Error> {
loop {
match self.input_pos.next() {
/* If there is still a character left in the input
* buffer then we can just return it immediately. */
Some(n) => return Ok(n),
/* Otherwise get the next line */
None => {
io::stdin().read_line(&mut self.input_buf)?;
/* Reset the iterator to the beginning of the
* line. Obviously this doesn’t work because it’s
* not obeying the lifetime of input_buf */
self.input_pos = self.input_buf.chars();
}
}
}
}
}
我正尝试完成Synacor challenge。这涉及实现一个虚拟机,其中一个操作码从stdin读取一个字符并将其存储在寄存器中。我已经成功地完成了这部分。文档说明,每当虚拟机内的程序读取一个字符时,它将一直读取,直到读取整行。我想利用这个来添加“保存”命令到我的实现中。这意味着每当程序请求一个字符时,我将从输入中读取一行。如果该行为“save”,我将保存虚拟机的状态,然后继续获取另一行以供虚拟机使用。每次虚拟机执行输入操作码时,我需要能够从缓冲行中逐个字符地提供输入,直到缓冲区耗尽。
我的当前实现在这里。我的计划是将
input_buf
和input_pos
添加到表示虚拟机状态的Machine
结构体中。