无法循环移出借用的内容

时间:2019-06-29 16:05:35

标签: rust iterator borrowing

我有以下问题:

struct NiceStructure<'a, T: Iterator<Item=&'a u32>> {
    it: T
}

fn f<'a, T: Iterator<Item=&'a u32>>(it: &mut NiceStructure<'a, T>) {
    // This does not work (1): cannot move out of borrowed content
    // for x in it.it {
    //     println!("Element {:?}", x);
    // }
    // This works
    loop {
        match it.it.next() {
            None => break,
            Some(x) => println!("Element {:?}", x)
        }
    }
}

fn g<'a, T: Iterator<Item=&'a u32>>(it: T) {
    // This works (2)
    for x in it {
        println!("Element {:?}", x);
    }
}

fn main() {
    f(&mut NiceStructure{it: vec![1, 2, 3].iter()});
    g(&mut vec![1, 2, 3].iter());
}

基于我对Rust的有限了解,for循环和嵌套next显式调用的循环应该等效。

我正在为以下问题而苦苦挣扎:

  • 所借的内容是什么?
  • 错误提及的“出局”是什么?
  • 为什么(1)不起作用,但是(2)起作用?
  • 我该如何实施?

[编辑:我需要部分问题的更多帮助]

我无法从所重复的问题中找到所有问题的答案:更具体地说,我无法理解为什么我可以使用显式next在该迭代器上进行迭代,但是我无法使用for指令,与显式next相比,在我看来只是语法糖。

[编辑其他渠道找到的答案]

尽管进行了编辑,问题仍然重复。 幸运的是,我找到了问题的答案。我在这里写它可能会有所帮助。

在传递it.it作为可变引用时,

NiceStructure导致移动。 it.it.next()使用it.it的可变引用,因为next方法采用&mut self。 以下内容不起作用:

fn f<'a, T: Iterator<Item=&'a u32>>(it: &mut NiceStructure<'a, T>) {
    // Here I am moving it.it, which is the same as when trying to use `for`
    let my_iterator = it.it;
    loop {
        match my_iterator.next() {
            None => break,
            Some(x) => println!("Element {:?}", x)
        }
    }
}

以下内容确实如此:

fn f<'a, T: Iterator<Item=&'a u32>>(it: &mut NiceStructure<'a, T>) {
    let my_iterator = &mut it.it;
    loop {
        match my_iterator.next() {
            None => break,
            Some(x) => println!("Element {:?}", x)
        }
    }
}

希望这会有所帮助。

0 个答案:

没有答案