无法摆脱借来的内容[E0507]

时间:2016-06-13 18:46:06

标签: rust

我正在写Rust的词法分析器来学习,但我坚持两个“无法摆脱借来的内容[E0507]”错误。

我尝试了所有解决方案,但似乎没有任何效果:RefCellclone()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() {}

2 个答案:

答案 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);
}