私は特性を持っており、構造体がこの特性を実装するならばIterator
として機能することができます。しかし、イテレータとして構造体を使用しようとすると、コンパイラエラーが発生します。特性はIteratorを実装しますが、Iteratorとしての私の特性を実装する構造体を使用できません
私は、さまざまなファイル形式から同じ種類のデータを読み込むライブラリを作成しています。私は、適切な錆のオブジェクトを返します一般的な "リーダー"特性を作成したい。私は各リーダが反復子として動作し、そのオブジェクトを生成できると言いたいと思います。
ここでコード
/// 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`
Hereは錆の遊び場上のコードです。
MyVec
はMyReader
を実装しているので、イテレータとして使用できるはずですから、.next()
を呼び出すことができます。 MyReader
を実装しているので、無料でIterator
の実装を取得する必要があります。行impl Iterator for ...
は、Iterator
が範囲内にあることを示しているので、エラーの原因を理解できません。
http://stackoverflow.com/q/34438755/155423およびhttp://stackoverflow.com/q/29256519/155423も参照してください。 – Shepmaster