【发布时间】:2017-05-13 10:37:18
【问题描述】:
我刚刚开始学习 Rust,我正在努力处理生命周期。
我想要一个带有String 的结构,用于缓冲来自标准输入的行。然后我想在结构上有一个方法,它从缓冲区返回下一个字符,或者如果该行中的所有字符都已被消耗,它将从 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。这涉及实现一个虚拟机,其中一个操作码从标准输入读取一个字符并将其存储在寄存器中。我的这部分工作正常。该文档指出,每当 VM 内的程序读取一个字符时,它都会继续读取,直到它读取整行。我想利用这一点在我的实现中添加一个“保存”命令。这意味着每当程序要求输入字符时,我都会从输入中读取一行。如果该行是“保存”,我将保存 VM 的状态,然后继续获取另一行以馈送到 VM。每次 VM 执行输入操作码时,我需要能够从缓冲的行一次给它一个字符,直到缓冲区耗尽。
我当前的实现是here。我的计划是将input_buf 和input_pos 添加到代表VM 状态的Machine 结构中。
【问题讨论】:
-
@DK。虽然它是一个相关的副本,但它并没有涵盖这种特殊情况的解决方案。
-
@E_net4:这是一个重复的问题。对我来说,最重要的是“我有理由想看到整条线......这应该是可行的”,这听起来像任何理论解决方案都必须打未指定要求的网球。如果问题被修改为不是关于存储迭代器,而是关于 实际 问题及其要求,请联系我,我会重新打开。
-
@DK。感谢您提供另一个问题的链接。尽管它有很多有用的信息,但我无法从中推断出我的问题的解决方案。特别是我的案例不涉及任何移动,这似乎是该问题的重点。我已经编辑了我的问题以解释确切的问题。
-
重新打开。就上下文而言,这个问题之前被标记为重复:stackoverflow.com/questions/32300132/…
-
我的案子不涉及任何搬家——当然可以。
read_line(&mut self.input_buf)可以重新分配String以增加分配,移动所有数据,使对其的任何引用无效(又名Chars迭代器)。
标签: rust