|
1 | 1 | <?xml version="1.0" encoding="utf-8"?> |
2 | 2 | <!-- $Revision$ --> |
3 | | -<!-- EN-Revision: 8fee3ae9715ffa15922469eb7d98f4878917a6ee Maintainer: takagi Status: ready --> |
| 3 | +<!-- EN-Revision: 873a99f094902ad72129ab391b1fb80525fab30e Maintainer: takagi Status: ready --> |
4 | 4 | <refentry xml:id="generator.rewind" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink"> |
5 | 5 | <refnamediv> |
6 | 6 | <refname>Generator::rewind</refname> |
7 | | - <refpurpose>イテレータを巻き戻す</refpurpose> |
| 7 | + <refpurpose>イテレータを最初の yield まで巻き戻す</refpurpose> |
8 | 8 | </refnamediv> |
9 | 9 |
|
10 | 10 | <refsect1 role="description"> |
|
14 | 14 | <void/> |
15 | 15 | </methodsynopsis> |
16 | 16 | <para> |
17 | | - 既に処理が始まっている場合は、例外をスローします。 |
| 17 | + このメソッドは ジェネレーターを最初の &yield; の前のポイントまで巻き戻します。 |
| 18 | + このメソッドがコールされた際に、 |
| 19 | + ジェネレーターが最初の &yield; 式に達していない場合、 |
| 20 | + 巻き戻す前に最初の &yield; まで進めます。 |
| 21 | + ジェネレーターが既に二番目の &yield; の始点に達している場合は |
| 22 | + <classname>Exception</classname> がスローされます。 |
18 | 23 | </para> |
19 | 24 |
|
| 25 | + <note> |
| 26 | + <para> |
| 27 | + これは、&foreach; ループを開始する際に <emphasis>最初に</emphasis> |
| 28 | + コールされるメソッドです。&foreach; ループが実行された |
| 29 | + <emphasis>後に</emphasis> 実行されるのでは |
| 30 | + <emphasis>ありません</emphasis>。 |
| 31 | + </para> |
| 32 | + </note> |
20 | 33 | </refsect1> |
21 | 34 |
|
22 | 35 | <refsect1 role="parameters"> |
|
31 | 44 | </para> |
32 | 45 | </refsect1> |
33 | 46 |
|
| 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> |
34 | 123 |
|
35 | 124 | </refentry> |
36 | 125 | <!-- Keep this comment at the end of the file |
|
0 commit comments