我正在写Rust的词法分析器来学习,但我坚持两个“无法摆脱借来的内容[E0507]”错误。
我尝试了所有解决方案,但似乎没有任何效果:RefCell
,clone()
,by_ref()
,将&mut self
更改为self
或{ {1}}或&self
,或解除引用。
这是我的代码:
mut self
struct Snapshot {
Index: u32,
}
struct Tokenizable<'a, T: 'a>
where T: Iterator
{
Index: u32,
Items: &'a T,
Snapshots: Vec<Snapshot>,
}
impl<'a, T> Tokenizable<'a, T>
where T: Iterator
{
fn new(items: &'a T) -> Tokenizable<'a, T> {
Tokenizable {
Index: 0,
Items: items,
Snapshots: Vec::new(),
}
}
fn end(&mut self) -> bool {
match self.Items.peekable().peek() {
Some(c) => false,
None => true,
}
}
fn peek(&mut self) -> Option<&T::Item> {
match self.Items.peekable().peek() {
Some(c) => Some(c),
None => None,
}
}
}
fn main() {}
答案 0 :(得分:3)
正如您在docs中看到的那样,peekable
函数按值获取迭代器。因此,只有在拥有迭代器时它才有效。但是,在您的代码中,Items
是迭代器的共享引用。
解决此问题需要从不同的角度接近它。例如,您可以在构造函数中按值获取迭代器,并调整struct以将可查看的迭代器存储在Items
字段中。
答案 1 :(得分:1)
基本上,从这里可以学到的是,过度复杂化和过度工程化的事情几乎总是弊大于利。
use std::iter::Peekable;
struct Snapshot {
index: u32
}
struct Tokenizable<T> where T: Iterator {
index : u32,
items : Peekable<T>,
snapshots : Vec<Snapshot>,
}
impl<T> Tokenizable<T> where T: Iterator {
fn new (items: T) -> Tokenizable<T> {
Tokenizable {
index : 0,
items : items.peekable (),
snapshots : Vec::new (),
}
}
fn end (&mut self) -> bool {
match self.items.peek () {
Some (c) => false,
None => true
}
}
fn peek (&mut self) -> Option<&<T as Iterator>::Item> {
match self.items.peek () {
Some (c) => Some (c),
None => None
}
}
}
fn main () {
let mut data = "Hello".chars ();
let tokenizable = Tokenizable::new (data);
}