元に戻さないでくださいpopFront
。arr[-1 .. $]
配列と同等のことさえできません。古いバージョンが必要な場合は、最初に保存する必要があります。
auto saved = range.save;
range.popFront();
range = saved; // "undo" popFront()
配列はそれ以上の機能も提供しません。範囲 API を使用せずに配列で同じことを行うには、次のようにする必要があります。
auto saved = arr;
arr = arr[1 .. $];
arr = saved;
範囲または配列に対するポップ操作を「元に戻す」唯一の方法は、最初に保存してから古いバージョンを使用することです。範囲 API または配列によって提供されるものは他にありません。それらは独自に状態を保存しません (したがって、前の操作を元に戻す方法を知ることができませんでした)。また、配列スライスでさえ、メモリ内でそれらの前または後にどのデータが存在するかを認識していません (また、前または前にメモリにアクセスしようとしています)。 )をヒットしたときに見たように、配列の後は違法ですRangeError
。
したがって、任意の数の要素のポップオフを「元に戻す」ことを心配する必要がある場合は、元の範囲を保持して、要素の数を追跡するなどのことを行う必要があるでしょう。必要な「元に戻す」レベルの数を引いた数の要素をポップオフできるように、それをポップします。そして、ここで多くのコピーが行われる可能性は低いですが (配列の場合、同じメモリを指しているが、その中の異なる場所にある複数のスライスになるだけです)、スライスを使用して範囲を扱っていない場合は、そのすべてが行われます。特に一度に 1 つのレベルを元に戻そうとしている場合、ポップオフはコストがかかる可能性があります (各要素がポップオフされる前から範囲の保存されたバージョンを保持する可能性があるため)。やろうとしている、