サーチ…
前書き
イテレータは、
Iterator
特性によって記述されるRustの強力な言語機能です。イテレータは、 Vec<T>
ようなコレクションのような型に対して多くの操作を実行することを可能にし、それらは簡単に構成可能です。
アダプターと消費者
イテレータメソッドは、2つの異なるグループに分けることができます。
アダプター
アダプタはイテレータを受け取り、別のイテレータを返します
// Iterator Adapter
// | |
let my_map = (1..6).map(|x| x * x);
println!("{:?}", my_map);
出力Map { iter: 1..6 }
値は列挙されていないことに注意してください。イテレータは熱心に評価されていないことを示します。イテレータは「怠惰な」ものです。
消費者
消費者はイテレータを取ってイテレータ以外のものを返し、その過程でイテレータを消費する。
// Iterator Adapter Consumer
// | | |
let my_squares: Vec<_> = (1..6).map(|x| x * x).collect();
println!("{:?}", my_squares);
出力[1, 4, 9, 16, 25]
消費者の他の例には、 find
、 fold
、およびsum
ます。
let my_squared_sum: u32 = (1..6).map(|x| x * x).sum();
println!("{:?}", my_squared_sum);
出力55
短い素数性テスト
fn is_prime(n: u64) -> bool {
(2..n).all(|divisor| n % divisor != 0)
}
もちろん、これは高速テストではありません。 n
平方根でのテストは中止できます:
(2..n)
.take_while(|divisor| divisor * divisor <= n)
.all(|divisor| n % divisor != 0)
カスタムイテレータ
struct Fibonacci(u64, u64);
impl Iterator for Fibonacci {
type Item = u64;
// The method that generates each item
fn next(&mut self) -> Option<Self::Item> {
let ret = self.0;
self.0 = self.1;
self.1 += ret;
Some(ret) // since `None` is never returned, we have an infinite iterator
}
// Implementing the `next()` method suffices since every other iterator
// method has a default implementation
}
使用例:
// the iterator method `take()` is an adapter which limits the number of items
// generated by the original iterator
for i in Fibonacci(0, 1).take(10) {
println!("{}", i);
}
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow