区别在于效率。例如,除 PHP 之外的许多语言都包含两种range
功能,range()
and xrange()
。这是生成器以及为什么使用它们的一个非常好的示例。让我们构建我们自己的:
function range($start, $end) {
$array = array();
for ($i = $start; $i <= $end; $i++) {
$array[] = $i;
}
return $array;
}
现在这真的很简单。然而,对于大范围,它需要大量的内存。如果我们尝试运行它$start = 0
and $end = 100000000
,我们可能会耗尽内存!
但如果我们使用生成器:
function xrange($start, $end) {
for ($i = $start; $i <= $end; $i++) {
yield $i;
}
}
现在我们使用常量内存,但仍然有一个“数组”(类似结构),我们可以在同一空间中迭代(并与其他迭代器一起使用)。
事实并非如此replace一个数组,但它确实提供了一种避免需要内存的有效方法......
但它也可以节省物品的生成。由于每个结果都是根据需要生成的,因此您可以延迟执行(获取或计算)每个元素,直到需要它为止。例如,如果您需要从数据库中获取一个项目并对每一行进行一些复杂的处理,您可以使用生成器延迟该操作,直到您真正需要该行为止:
function fetchFromDb($result) {
while ($row = $result->fetchArray()) {
$record = doSomeComplexProcessing($row);
yield $record;
}
}
因此,如果您只需要前 3 个结果,则只需处理前三个记录。
有关更多信息,我写了一个博客文章 http://blog.ircmaxell.com/2012/07/what-generators-can-do-for-you.html关于这个确切的主题。