2022年7月27日 星期三

dart Iterator 的運作方法

 為了讓類型可以運用在 for (  in )  { } 迴圈上, 需要繼承 IterableBase 並實現 Iterator 介面類型, 總共有 3 個方法需要實現, 詳見以下範例程式 main.dart:

import 'dart:collection';
import 'dart:io';
class  Element {
  final id;
  static int _sn = 0;
  Element(): id = ++ _sn;
}

class ABC extends IterableBase<Element> implements Iterator<Element> {
  final List<Element> array;
  int lastone = 0;// length snapshot
  int index   = 0;// start snapshot
  @override Element get current => array[index];//get 方法 current 實現
  @override bool moveNext( ) => index != lastone && (++ index >= 0);//方法 moveNext( )實現
  @override Iterator<Element> get iterator {//get 方法 iterator 實現
    lastone = array.length - 1;
    index  = -1;
    return this;
  }
  ABC([List<Element>? mjList]): array = mjList ?? [ ] {
    for(int i = 0; i< 10; i++) array.add(Element( ));
  }
}

void main( ) {
  final a = ABC();
  for (final e in a) {
    stdout.write("[${a.index}] = ${e.id}, ");
  };
  print(":: index = ${a.index} lastone= ${a.lastone}\n");

  for (final e in a) {
    stdout.write("[${a.index}] = ${e.id}, ");
  };
  print(":: index = ${a.index} lastone= ${a.lastone}\n");
}

執行 dart main.dart 看結果:

[0] = 1, [1] = 2, [2] = 3, [3] = 4, [4] = 5, [5] = 6, [6] = 7, [7] = 8, [8] = 9, [9] = 10, :: index = 9 lastone= 9

[0] = 1, [1] = 2, [2] = 3, [3] = 4, [4] = 5, [5] = 6, [6] = 7, [7] = 8, [8] = 9, [9] = 10, :: index = 9 lastone= 9

沒有留言:

張貼留言

使用 pcie 轉接器連接 nvme SSD

之前 AM4 主機板使用 pcie ssd, 但主機板故障了沒辦法上網, 只好翻出以前買的 FM2 舊主機板, 想辦法讓老主機復活, 但舊主機板沒有 nvme 的界面, 因此上網買了 pcie 轉接器用來連接 nvme ssd, 遺憾的是 grub2 bootloader 無法識...