繁体   English   中英

Trait实现了Iterator,但是不能使用实现我的trait的结构作为Iterator

[英]Trait implements Iterator, but cannot use a struct implementing my trait as an Iterator

我有一个特性,我想说,如果一个结构实现了这个特性,那么它也可以充当Iterator 但是,当我尝试使用struct作为迭代器时,我遇到了编译器错误。

我正在编写一个库来从许多不同的文件格式中读取相同类型的数据。 我想创建一个通用的“读者”特征,它将返回适当的生锈对象。 我想说每个读者都可以作为迭代器运行,产生该对象。

这是代码

/// A generic trait for reading u32s
trait MyReader {
    fn get_next(&mut self) -> Option<u32>;
}

/// Which means we should be able to iterate over the reader, yielding u32s
impl Iterator for MyReader {
    type Item = u32;
    fn next(&mut self) -> Option<u32> {
        self.get_next()
    }
}

/// Example of a 'reader'
struct MyVec {
    buffer: Vec<u32>,
}

/// This can act as a reader
impl MyReader for MyVec {
    fn get_next(&mut self) -> Option<u32> {
        self.buffer.pop()
    }
}

fn main() {
    // Create a reader
    let mut veccy = MyVec { buffer: vec![1, 2, 3, 4, 5] };

    // Doesn't work :(
    let res = veccy.next();
}

编译器输出:

rustc 1.15.0 (10893a9a3 2017-01-19)
error: no method named `next` found for type `MyVec` in the current scope
  --> <anon>:31:21
   |
31 |     let res = veccy.next();
   |                     ^^^^
   |
   = help: items from traits can only be used if the trait is implemented and in scope; the following traits define an item `next`, perhaps you need to implement one of them:
   = help: candidate #1: `std::iter::Iterator`
   = help: candidate #2: `std::iter::ZipImpl`
   = help: candidate #3: `std::str::pattern::Searcher`

是生锈操场上的代码。

在我看来,既然MyVec实现了MyReader ,那么它应该可以作为迭代器使用,因此我应该可以在它上面调用.next() 由于我已经实现了MyReader ,那么我应该免费获得Iterator的实现,对吧? impl Iterator for ...表明Iterator在范围内,所以我无法理解错误的来源。

这条线不符合你的想法。

impl Iterator for MyReader {

这实现了特征对象 MyReader Iterator 你想要的是为每个也实现MyReader类型实现Iterator 不幸的是,由于一致性规则,这是不可能的。

在Rust中,您只能在定义特征的包中或在定义要实现它的类型的包中实现特征。 (对于泛型类型来说事情有点复杂,但这是基本的想法。)在这种情况下, Iterator是标准库的特征,所以没有办法在你没有定义的任意类型上实现它。 如果你考虑一下,这是有道理的,因为如果其中一个类型有一个预先存在的Iterator实现 - 你将使用哪一个,你会变得模棱两可?

一种解决方案是将实现MyReader的类型包装在MyReader中,并在其上实现Iterator 由于您自己定义了newtype,因此可以自由地在其上实现Iterator

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM