Reference 迭代器通过引用返回项,生存期问题

Reference 迭代器通过引用返回项,生存期问题,reference,iterator,rust,lifetime,Reference,Iterator,Rust,Lifetime,我有一个生命周期问题,我正在尝试实现一个迭代器,通过引用返回其项,下面是代码: struct Foo { d: [u8; 42], pos: usize } impl<'a> Iterator<&'a u8> for Foo { fn next<'a>(&'a mut self) -> Option<&'a u8> { let r = self.d.get(self.pos);

我有一个生命周期问题,我正在尝试实现一个迭代器,通过引用返回其项,下面是代码:

struct Foo {
   d: [u8; 42],
   pos: usize
}

impl<'a> Iterator<&'a u8> for Foo {
   fn next<'a>(&'a mut self) -> Option<&'a u8> {
      let r = self.d.get(self.pos);
      if r.is_some() {
         self.pos += 1;
      }
      r
   }
}

fn main() {
   let mut x = Foo {
      d: [1; 42],
      pos: 0
   };

   for i in x {
      println!("{}", i);
   }
}
structfoo{
d:[u8;42],
位置:usize
}
Foo的impl{
fn下一选项
关于所用Rust版本的注释:在编写此问题和答案时,
迭代器使用泛型;它已更改为使用关联类型,现在定义为:

pub特征迭代器{
类型项目;
fn next(&mut self)->选项;
…
}
因此,此处显示的错误实现如下所示:

impl-Option迭代器(&'a mut-self)->Option(&'a mut-self)->Option
不应该存在。为了方便起见并强调这里发生的事情,我将把impl块ρ上定义的
'a
命名为₀ 以及在方法ρ上定义的
'a
₁. 它们不一样

  • &mut self
    的寿命与特质的寿命不同

  • 返回类型的生存期与特征不同:其中
    A
    &'ρ₀ u8
    ,返回类型用于替换
    A
    &'ρ₁ u8
    。预计混凝土使用寿命ρ₀ 但是却发现了生命周期ρ₁. (我不确定“绑定”位的确切含义,所以我会保持沉默,以免出错。)


  • 这意味着:您不能将迭代对象的生存期连接到
    &mut self
    。相反,它必须绑定到您为其实现特征的类型中的某个对象。举个例子,迭代切片中的项是通过创建一个连接到基本切片的新迭代器对象来完成的,
    imp我必须说1-我一直在努力理解和正确使用struct和traits中指定的生存期/泛型类型/traits类型以及方法中使用的类型,因此我在本例中到处都使用了'a'。2-我想我非常理解你的观点,我试图对Rust代码及其库进行grepn为了找出类似情况是如何处理的,以及您所说的似乎与以下几种情况相对应:在具有引用属性的结构中使用寿命参数,例如libcore/slice.rs中拆分的迭代器。感谢您的帮助,有时您可能会发现标准库中的示例难以理解;例如例如,
    Items
    实际上是由宏生成的,因此您需要先了解Rust宏的基本知识,然后才能对其进行摸索!随时准备访问irc://irc.mozilla.org/#rust,总是有人在那里帮助。我要指出,退回一件终身保存的物品有一个重要的原因不与迭代器链接:这允许在迭代中实现转换,这是C++中非常难做的事情。这个答案不再有效。显然合并在2015中,它现在出错了。impl@JonasBerlin:这个答案从来没有包含功能代码,它只是解释了为什么要尝试什么mpted不起作用。
    $ rustc test.rs
    test.rs:8:5: 14:6 error: method `next` has an incompatible type for trait: expected concrete lifetime, but found bound lifetime parameter
    test.rs:8     fn next<'a>(&'a mut self) -> Option<&'a u8> {
    test.rs:9         let r = self.d.get(self.pos);
    test.rs:10         if r.is_some() {
    test.rs:11             self.pos += 1;
    test.rs:12         }
    test.rs:13         r
               ...
    test.rs:8:49: 14:6 note: expected concrete lifetime is the lifetime 'a as defined on the block at 8:48
    test.rs:8     fn next<'a>(&'a mut self) -> Option<&'a u8> {
    test.rs:9         let r = self.d.get(self.pos);
    test.rs:10         if r.is_some() {
    test.rs:11             self.pos += 1;
    test.rs:12         }
    test.rs:13         r
               ...
    error: aborting due to previous error