在按引用生成器中使用"yield from"有什么替代方案吗?



我想使用一些使用Generators 作为返回类型和按引用的方法。但是,问题在于一个方法获取另一个方法的返回值,该值按引用返回并且是Generator,并按引用返回。此外,几乎所有方法在生成一个或多个值后都会返回一个值。

让我们在代码中查看:

class YieldFromByReferenceTest
{
public $data = [
"Ubuntu",
"CentOS",
"Fedora"
];
protected function &sampleGenerator(): Generator
{
foreach ($this->data as $key => &$datum) {
yield $key => $datum;
}
// This is just a sample return type
return true;
}
public function &useGenerator(): Generator
{
$generator = $this->sampleGenerator();
// Return $generator?
}
}

首先,yield from出现在我的脑海中。但是,当我尝试使用它时,它给了我以下错误:

PHP Fatal error: Cannot use "yield from" inside a by-reference generator in ./test.php on line xx

这对我来说看起来很奇怪。我不知道为什么它不起作用(在我看来,它应该有效)。所以,我的问题是:

  1. 在这种情况下,为什么yield from无法按预期工作并生成错误?不应该行吗?

  2. 有哪些替代解决方案?

谢谢!

我将发布两个解决方案(请考虑将以下代码替换为部分:// Return $generator?在问题中的代码中),但我无法真正回答我的第一个问题。

屈服与回归

一种可能的解决方案是从sampleGenerator()中生成所有值,然后返回其返回值:

// Please notice the &
foreach ($generator as $key => &$value) {
yield $key => $value;
}
return $generator->getReturn();

它可以完美地工作,并防止错误,即使使用嵌套生成器或生成器不产生或返回任何值。但是,在某些情况下,对我来说,由于经常使用它,代码会变得更加难以阅读。

返回生成器本身

简单地说,您可以返回返回的生成器:

return $generator;

乍一看,它看起来更简单,但如果你正在处理一些复杂的代码段,那么它就会变得有点复杂。请记住,除非您在函数中的某处使用yield语句,否则它会返回一个Generator实例,并且它不是生成器函数。尽管如此,就像发生在我身上一样,您的问题可以通过添加空收益来解决(注意,它将是一个生成器):

return $generator;
yield;

注意:这可能很明显,但这些并非总是有效的解决方案。您应该考虑自己的问题,然后尝试解决它;因此,您可能需要两种方式来完成工作!

希望对您有所帮助!

相关内容

最新更新