【 Flutter 】Flutter を 基礎 から 学習 ( Dart編 ) part35 Dartの特徴
「基礎 から 学ぶ Flutter 」という書籍で 学習 したことを ブログでアウトプットしていこうと思います。今回は Dart編 ( part35 )です。
前回
【 Flutter 】Flutter を 基礎 から 学習 ( Dart編 ) part34 Dartの特徴
今回はジェネレーターについて学習します。
Dartの特徴
ジェネレーター
反復動作を制御するための特別なルーチンです。
Dartでもyeild
というキーワードを使用して実装することが多いのではないでしょうか。
Dartでは「同期ジェネレータ(Iterator型)」と「非同期ジェネレータ(Stream型)」が存在するそうです。
Iteratorの理解
このジェネレータはIterator型です。
Iterator
はなかなか説明が難しいですが「リストの現在位置を指し示すオブジェクト」と覚えておくとよいかもしれません。
通常リストの操作は自身で要素を指定しますが、Iterator
に「次の要素ちょうだい」と頼み続けるだけで次々に要素を持ってきてくれます。
DartではIterable
を継承して自身のクラスでIterator
を実現できます。
何がすごいかというと、このクラスを継承したクラスはfor
ループで使用することができるようになることなのです!
自分でリストのようなクラスを作れるということですね。
class MyStrings extends Iterable<String> {
final List<String> strings;
MyStrings(this.strings);
// ★
@override
Iterator<String> get iterator {
// 今回はListが持っているIteratorオブジェクトを返却しています。
return strings.iterator;
}
}
void main() {
final hoges = MyStrings(['aaa', 'bbb', 'ccc']);
// 自分で作ったMyStringsクラスのオブジェクトが繰り返しで使用できる!
// しかもmoveNext()はcurrentとか面倒事も必要ないです。
for (final hoge in hoges) {
print(hoge);
}
// mapも使えます。len_listは数値のリストです。
var lenList = hoges.map((v) => v.length);
for(final len in lenList) {
print(len);
}
// iterator(★を使って)を取得して直接操作もできます。
// 以下のサンプルはfor (final hoge in hoges) {・・・と同じ結果になります。
var ite = hoges.iterator;
while(ite.moveNext()) {
var elm = ite.current;
print(elm);
}
}
最後に
Iterator
は概念を押さえておかないと使うことは少し難しい印象です。
「自分でforが使えるオリジナルクラスが作れる!」と覚えておけばよいかもしれないです。
今日はここまで!
ディスカッション
コメント一覧
まだ、コメントがありません