我正在尝试设置耦合收益函数。但是当第二次调用该函数时,自的集成收益不会重置。
我认为最简单的方法是使用示例进行展示:
PHP
Sub SelectAndCopyPaste()
Dim lastrow() As String
Dim pt As PivotTable
Worksheets("Sheet1").Activate
ActiveSheet.Cells.Clear
With Worksheets("Pivot Sheet")
.Activate
Set pt = .PivotTables("PivotTable2")
lastrow = Split(pt.RowRange.Address, ":")
.Range(lastrow(1)).Offset(-1, 6).Select 'here is where you set which cell you want to choose
Selection.ShowDetail = True
Selection.Copy
End With
Worksheets("Sheet1").Select
ActiveSheet.Cells(1, 1).PasteSpecial xlPasteValues
End Sub
我希望“测试2”的输出与“测试1”相同。但是实际上,似乎发电机使用后的产量并未重置。
就像@Ganesh Wagh指出的那样:在第二个“ for-each”中调用生成器是完美的。仅在调用“ iterator_to_array”时才会发生此问题!这是预期的行为吗?
我试图像这样在generatorB的末尾重置generatorA:
PHP
class GeneratorTest
{
public function generatorA() {
for ($i = 0; $i < 10; $i++) {
yield $i;
}
}
// Generators can yield from other generators
public function generatorB() {
yield from $this->generatorA(); // << why is this not reset?
for($i = 0; $i < 26; $i++) {
yield chr(65 + $i);
}
}
}
$gen = new GeneratorTest();
echo "Test 1 from Generator B<br>";
foreach ($gen->generatorB() as $item) {
echo $item . "<br>";
}
echo "Test 2 from Generator B<br>";
print_r(iterator_to_array($gen->generatorB()));
但无济于事。
问题:这是预期的行为吗?我该怎么做才能重置“内部”生成器?
答案 0 :(得分:0)
所有功劳归@Frankich! (第二条评论)
问题是,“ iterator_to_array”评估了生成器的键。
因此,生成器以静默方式返回使用过的生成器的密钥(从中产生):
echo "Test 1 from Generator B\n";
foreach ($gen->generatorB() as $key => $item) {
echo $key . '=>' . $item . "\n";
}
结果:
1=>1
2=>2
...
0=>A
1=>B
2=>C
...
所以其中的键:
iterator_to_array($gen->generatorB()))
被覆盖(如@Frankich指出)!
,仅:
iterator_to_array($gen->generatorB()), false)
阻止了这种情况。
输入谢谢!