Skip to content

Commit 0d1d4f9

Browse files
committed
sync with en / rewind.xml Give more details about the generator's rewinding
https://github.com/php/doc-en/commits/master/language/predefined/generator/rewind.xml
1 parent 6bda11d commit 0d1d4f9

File tree

1 file changed

+92
-3
lines changed

1 file changed

+92
-3
lines changed

language/predefined/generator/rewind.xml

Lines changed: 92 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<!-- $Revision$ -->
3-
<!-- EN-Revision: 8fee3ae9715ffa15922469eb7d98f4878917a6ee Maintainer: takagi Status: ready -->
3+
<!-- EN-Revision: 873a99f094902ad72129ab391b1fb80525fab30e Maintainer: takagi Status: ready -->
44
<refentry xml:id="generator.rewind" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
55
<refnamediv>
66
<refname>Generator::rewind</refname>
7-
<refpurpose>イテレータを巻き戻す</refpurpose>
7+
<refpurpose>イテレータを最初の yield まで巻き戻す</refpurpose>
88
</refnamediv>
99

1010
<refsect1 role="description">
@@ -14,9 +14,22 @@
1414
<void/>
1515
</methodsynopsis>
1616
<para>
17-
既に処理が始まっている場合は、例外をスローします。
17+
このメソッドは ジェネレーターを最初の &yield; の前のポイントまで巻き戻します。
18+
このメソッドがコールされた際に、
19+
ジェネレーターが最初の &yield; 式に達していない場合、
20+
巻き戻す前に最初の &yield; まで進めます。
21+
ジェネレーターが既に二番目の &yield; の始点に達している場合は
22+
<classname>Exception</classname> がスローされます。
1823
</para>
1924

25+
<note>
26+
<para>
27+
これは、&foreach; ループを開始する際に <emphasis>最初に</emphasis>
28+
コールされるメソッドです。&foreach; ループが実行された
29+
<emphasis>後に</emphasis> 実行されるのでは
30+
<emphasis>ありません</emphasis>。
31+
</para>
32+
</note>
2033
</refsect1>
2134

2235
<refsect1 role="parameters">
@@ -31,6 +44,82 @@
3144
</para>
3245
</refsect1>
3346

47+
<refsect1 role="examples">
48+
&reftitle.examples;
49+
<para>
50+
<example>
51+
<title><methodname>Generator::rewind</methodname> の例</title>
52+
<programlisting role="php">
53+
<![CDATA[
54+
<?php
55+
56+
function generator(): Generator
57+
{
58+
echo "I'm a generator!\n";
59+
60+
for ($i = 1; $i <= 3; $i++) {
61+
yield $i;
62+
}
63+
}
64+
65+
// ジェネレータを初期化
66+
$generator = generator();
67+
68+
// まだ達していない場合、最初の yield 式の開始までジェネレータを巻き戻します。
69+
$generator->rewind(); // I'm a generator!
70+
71+
// ここでは何も起きません; ジェネレータは既に巻き戻されています。
72+
$generator->rewind(); // No output (NULL)
73+
74+
// ここでは、まだ達していない場合、
75+
// 最初の yield 式の開始までジェネレータを巻き戻します。
76+
// そして、ジェネレータを反復します。
77+
foreach ($generator as $value) {
78+
// 最初の値を yield したあと、ジェネレータは
79+
// 実行が再開されて次の yield に進むまで最初の
80+
// yield 式にとどまったままです。
81+
echo $value, PHP_EOL; // 1
82+
83+
break;
84+
}
85+
86+
// 巻き戻しを再開します。
87+
// エラーは発生しません。なぜんら、ジェネレータは最初の yield を越えて
88+
// 進んでいないからです。
89+
$generator->rewind();
90+
91+
echo $generator->current(), PHP_EOL; // 1
92+
93+
// エラーは起きません。
94+
// ジェネレータはまだ最初の yield に留まっています。
95+
$generator->rewind();
96+
97+
// ここで、ジェネレータを二回目の yield 式に進めます。
98+
$generator->next();
99+
100+
try {
101+
// これは、例外をスローします。
102+
// なぜなら、既にジェネレータが二回目の yield に進んでいるからです。
103+
$generator->rewind(); // Fatal error: Uncaught Exception: Cannot rewind a generator that was already run
104+
} catch (Exception $e) {
105+
echo $e->getMessage();
106+
}
107+
108+
?>
109+
]]>
110+
</programlisting>
111+
&example.outputs;
112+
<screen>
113+
<![CDATA[
114+
I'm a generator!
115+
1
116+
1
117+
Cannot rewind a generator that was already run
118+
]]>
119+
</screen>
120+
</example>
121+
</para>
122+
</refsect1>
34123

35124
</refentry>
36125
<!-- Keep this comment at the end of the file

0 commit comments

Comments
 (0)