Iterable<E>.generate 构造函数

Iterable<E>.generate(
  1. int count, [
  2. E generator(
    1. int index
    )?
])

创建一个动态生成元素的 Iterable

生成的可迭代有 count 个元素,索引为 n 的元素通过调用 generator(n) 计算得出。值不会被缓存,因此每次迭代都会重新计算值。

如果省略 generator,则默认为整数上的恒等函数 (int x) => x,因此只有在类型参数允许整数值时才能省略。也就是说,如果 Eint 的超类型。

作为一个 IterableIterable.generate(n, generator)) 等同于 const [0, ..., n - 1].map(generator)

实现

factory Iterable.generate(int count, [E generator(int index)?]) {
  // Always OK to omit generator when count is zero.
  if (count <= 0) return EmptyIterable<E>();
  if (generator == null) {
    // If generator is omitted, we generate integers.
    // If `E` does not allow integers, it's an error.
    Function id = _GeneratorIterable._id;
    if (id is! E Function(int)) {
      throw ArgumentError(
          "Generator must be supplied or element type must allow integers",
          "generator");
    }
    generator = id;
  }
  return _GeneratorIterable<E>(count, generator);
}