<?php
function rrmdir($dir) {
if (is_dir($dir)) {
$objects = scandir($dir);
foreach ($objects as $object) {
if ($object != "." && $object != "..") {
if (filetype($dir."/".$object) == "dir")
rrmdir($dir."/".$object);
else unlink ($dir."/".$object);
}
}
reset($objects);
rmdir($dir);
}
}
?>
Попробуйте выставить код из php.net
Работайте со мной отлично
Это определяет, что итератор закончился. Можно думать yield break
как return
оператор, который не возвращает значение.
, Например, если Вы определяете функцию как итератор, тело функции может быть похожим на это:
for (int i = 0; i < 5; i++)
{
yield return i;
}
Console.Out.WriteLine("You will see me");
Вексель, что после того, как цикл завершил все свои циклы, последняя строка, оформлен, и Вы будете видеть сообщение в своем консольном приложении.
Или как это с yield break
:
int i = 0;
while (true)
{
if (i < 5)
{
yield return i;
}
else
{
// note that i++ will not be executed after this
yield break;
}
i++;
}
Console.Out.WriteLine("Won't see me");
В этом случае последний оператор никогда не выполняется, потому что мы оставили функцию рано.
Заканчивает блок итератора (например, говорит, что больше нет элементов в IEnumerable).
Говорит итератору, что он достиг конца.
Как пример:
public interface INode
{
IEnumerable<Node> GetChildren();
}
public class NodeWithTenChildren : INode
{
private Node[] m_children = new Node[10];
public IEnumerable<Node> GetChildren()
{
for( int n = 0; n < 10; ++n )
{
yield return m_children[ n ];
}
}
}
public class NodeWithNoChildren : INode
{
public IEnumerable<Node> GetChildren()
{
yield break;
}
}
Целый предмет блоков итератора покрыт хорошо в этом глава бесплатного образца из книги Jon Skeet C# подробно .
Если, что Вы подразумеваете, "что действительно приводит к повреждению действительно, делают", "как делает оно работает" - Видят блог Raymond Chen для деталей http://blogs.msdn.com/oldnewthing/archive/2008/08/12/8849519.aspx
, итераторы C# генерируют некоторый очень сложный код.
yield
в основном заставляет метод IEnumerable
вести себя аналогично кооперативному (а не вытесняющему) запланированному потоку.
yield return
похож на поток, вызывающий функцию «расписание» или «сна», чтобы отказаться от управления процессором. Подобно потоку, метод IEnumerable
восстанавливает элементы управления в точке сразу после этого, при этом все локальные переменные имеют те же значения, что и до того, как управление было прекращено.
yield break
подобен потоку, достигающему конца своей функции и завершающемуся.
Люди говорят о «конечном автомате», но конечный автомат - это все, что «поток» на самом деле является. У потока есть некоторое состояние (т.е. значения локальных переменных), и каждый раз, когда он запланирован, он предпринимает некоторые действия, чтобы перейти в новое состояние. Ключевым моментом в yield
является то, что, в отличие от потоков операционной системы, к которым мы привыкли, код, который его использует, замораживается во времени до тех пор, пока итерация не будет продвинута вручную или завершена вручную.
Здесь http://www.alteridem.net/2007/08/22/the-yield-statement-in-c/ - очень хороший пример:
public static IEnumerable<int> Range( int min, int max ) { while ( true ) { if ( min >= max ) { yield break; } yield return min++; } }
и пояснение, что если В методе сработал оператор yield break
, выполнение этого метода останавливается без возврата. Бывают ситуации, когда вы не хотите давать никакого результата, тогда вы можете использовать yield break.