Разница между return
и yield
казалась очевидной, пока я не выяснил, была также yield from
и возможность комбинировать и то return
и другое в одной и yield
той же функции!
Мое понимание return
было то, что все после не было выполнено, верно?
Однако:
function generate(): iterable {
return [1, 2, 3];
}
foreach (generate() as $value) {
echo $value;
}
Производит: "123"
Но следующее:
function generate(): iterable {
return [1, 2, 3];
yield;
}
foreach (generate() as $value) {
echo $value;
}
Ничего не производит! Так что значит доходность выполнена?
Это ошибка?
var_dump(generate()->GetReturn());
Ответы:
Return
Просто возвращает уникальное значение вызывающему.
Yield
Преобразуйте текущую функцию / метод так, чтобы она возвращала значение a
Generator
, которое будет давать больше, чем уникальное значение: каждый разyield
, когда срабатывает, оно дает значение вызывающей стороне, по одному за раз, традиционно используяforeach
цикл.Yield
+Return
Генераторы, кроме генерации значений, также могут предоставлять уникальное возвращаемое значение. Это значение не будет частью цикла вокруг генератора, к нему нужно обращаться с помощью
Generator::getReturn()
метода.Return
+Yield
Это можно рассматривать как ошибку, однако это не так.
Это две фазы:
generate()
функция содержитyield
ключевое слово и поэтому помечается как создающаяGenerator
.return
случается раньшеyield
, у генератора нет шансов произвести какое-либо значение. Однако[1, 2, 3]
массив можно получить с помощьюGenerator::getReturn()
.Полный аннотированный пример:
источник
Из документации :
Таким образом, не имеет значения,
yield
выполняется ли это, анализатор видит его где-то в определении функции и превращает его в генератор.Если функция никогда не выполняет
yield
инструкцию, то генератор не производит никаких значений. Возвращаемое значениеreturn
игнорируется, когда вы пытаетесь использовать результат. В документации сказано:Так что вы могли бы сделать:
источник