在回调中使用 yield?
Using yield in callback?
我有一个函数 y()
应该会产生一些记录。
然而,此函数在传递给另一个函数 d()
的回调中获取记录以访问数据。
d()
不会 return 或产生任何东西。
如果接受回调的其他函数 d()
被视为黑盒,那么这种模式是否可行?
什么是替代设计?
function y() {
d( function ($records) { // May be called multiple times
// How to yield for "y()"?
foreach ($records as $record)
yield $record;
} );
}
写yield
把匿名回调函数变成生成器函数。您需要调用此生成器函数来接收生成器,然后迭代该生成器。但是由于 d
正在调用匿名函数,所以它是最终生成器的函数,而不是 y
的调用者。所以这个用处不大,实际上是行不通的。
看来你能做的最好的是:
function y() {
$results = [];
d(function ($val) use (&$results) {
$results[] = $val;
});
return $results;
}
foreach (y() as $val) {
echo $val, PHP_EOL;
}
这当然取决于 d
在某个时候返回。如果它在内部使用无限循环,这不会有任何好处。在这种情况下,您需要继续从回调中调用更多回调,这是典型的事件监听器模式。
您可以即兴创作回调!我用一个对象数组(生成器)和 array_map
<?php
function pushyield($p){
yield $p;
}
$tt[]=pushyield(1);
$tt[]=pushyield(10);
$tt[]=pushyield(100);
function parse($n)
{
//var_dump($n);echo('<hr style="width:30px;">');
foreach($n as $ln) echo $ln.'<br>';
}
$b = array_map("parse", $tt);
?>
我有一个函数 y()
应该会产生一些记录。
然而,此函数在传递给另一个函数 d()
的回调中获取记录以访问数据。
d()
不会 return 或产生任何东西。
如果接受回调的其他函数 d()
被视为黑盒,那么这种模式是否可行?
什么是替代设计?
function y() {
d( function ($records) { // May be called multiple times
// How to yield for "y()"?
foreach ($records as $record)
yield $record;
} );
}
写yield
把匿名回调函数变成生成器函数。您需要调用此生成器函数来接收生成器,然后迭代该生成器。但是由于 d
正在调用匿名函数,所以它是最终生成器的函数,而不是 y
的调用者。所以这个用处不大,实际上是行不通的。
看来你能做的最好的是:
function y() {
$results = [];
d(function ($val) use (&$results) {
$results[] = $val;
});
return $results;
}
foreach (y() as $val) {
echo $val, PHP_EOL;
}
这当然取决于 d
在某个时候返回。如果它在内部使用无限循环,这不会有任何好处。在这种情况下,您需要继续从回调中调用更多回调,这是典型的事件监听器模式。
您可以即兴创作回调!我用一个对象数组(生成器)和 array_map
<?php
function pushyield($p){
yield $p;
}
$tt[]=pushyield(1);
$tt[]=pushyield(10);
$tt[]=pushyield(100);
function parse($n)
{
//var_dump($n);echo('<hr style="width:30px;">');
foreach($n as $ln) echo $ln.'<br>';
}
$b = array_map("parse", $tt);
?>