拆分PHP生成器
我刚刚编写了生成器的一部分,已经到了可以正常工作的地步,但需要一些重构。该方法的结构如下:拆分PHP生成器,php,iterator,generator,Php,Iterator,Generator,我刚刚编写了生成器的一部分,已经到了可以正常工作的地步,但需要一些重构。该方法的结构如下: public function getFlattenedList( array $elements ) { foreach ( $elements as $element ) { if ( $this->someCondition( $element ) ) { // A pile of stuff here if ( $an
public function getFlattenedList( array $elements ) {
foreach ( $elements as $element ) {
if ( $this->someCondition( $element ) ) {
// A pile of stuff here
if ( $anotherCondition ) {
for ( $i = 0; $i < $this->someValue(); $i++ ) {
yield $this->anotherOperation( $element );
}
}
}
else {
yield $this->someOperation( $element );
}
}
}
在保持生成器行为并很好地分割方法的同时,是否可以避免添加该循环?我以前没有使用过生成器,所以可能遗漏了一些明显的东西。您实际上要做的就是所谓的生成器委托,现在它已经成为PHP版本的问题。只有PHP版本7及更高版本支持生成器委派,它如下所示:
function gen_y() {
yield 1;
yield 2;
}
function gen_x() {
yield from gen_y();
yield from gen_y();
}
这将为您提供所需的效果或“递归”或“嵌套”或“委托”生成器调用。但现在的问题是PHP7。没有多少生产环境运行PHP7。为此,您需要编写另一个生成器,它接受生成生成器的生成器。就像一个转换器
我不会将代码粘贴到这里,但我最近遇到了这个问题,这迫使我在PHP5中编写了一个包来完成这项工作:
使用此包时,您只需生成生成器,并使用包提供的方法包装初始生成器调用
use Hedronium\GeneratorNest\GeneratorNest;
function gen_x() {
yield gen_y();
yield gen_y();
}
foreach (GeneratorNest::nested(gen_x()) as $x) {
// Your Code.
}
我鼓励你看看资料来源,了解实际情况。是的 为什么不用一个简单的
yield$this->getFlatteElement($element)消除foreach($this->getFlatteElement($element)作为$flatted){yield$flatted;}
循环代码>试试看!您的循环正在由getFlatteElement()
generatorI处理。我尝试了这个方法,但是我的测试失败了,所以它肯定不是等效的。如果我这样做,它将产生生成器,从而产生类型为generator
no的结果?没有理由不工作:它不应该产生生成器,但应该产生生成器的结果。。。。递归生成器可以工作如果我对公共生成器的结果调用迭代器到数组
,数组将包含生成器实例<代码>[ResultClass 0,Generator,ResultClass 3]而不是[ResultClass 0,ResultClass 1,ResultClass 2,ResultClass 3]
。那不是我想要的。
function gen_y() {
yield 1;
yield 2;
}
function gen_x() {
yield from gen_y();
yield from gen_y();
}
use Hedronium\GeneratorNest\GeneratorNest;
function gen_x() {
yield gen_y();
yield gen_y();
}
foreach (GeneratorNest::nested(gen_x()) as $x) {
// Your Code.
}