これは一種の間接的な答えですが、この質問の背後にあるロジックについて考えさせられました。これは共有する価値があるかもしれないと思いました.
他の誰もが言っdo ... while
たように、本体を少なくとも 1 回実行する場合は、ループを使用します。しかし、どのような状況でそれをしたいですか?
まあ、私が考えることができる状況の最も明白なクラスは、チェック条件の初期 (「プライミングされていない」) 値が、終了したい場合と同じ場合です。これは、ループ本体を 1 回実行して条件を存在しない値に設定し、その条件に基づいて実際の繰り返しを実行する必要があることを意味します。プログラマーが非常に怠け者であるために、誰かがこれを制御構造にまとめることにしました。
たとえば、タイムアウト付きのシリアルポートからの文字の読み取りは、(Python で)次の形式を取る可能性があります。
response_buffer = []
char_read = port.read(1)
while char_read:
response_buffer.append(char_read)
char_read = port.read(1)
# When there's nothing to read after 1s, there is no more data
response = ''.join(response_buffer)
コードの重複に注意してください: char_read = port.read(1)
. Python にdo ... while
ループがあった場合、次を使用した可能性があります。
do:
char_read = port.read(1)
response_buffer.append(char_read)
while char_read
ループの新しいスコープを作成する言語の追加の利点はchar_read
、関数の名前空間を汚染しないことです。しかし、これを行うためのより良い方法があることにも注意してください。それは、Python のNone
値を使用することです。
response_buffer = []
char_read = None
while char_read != '':
char_read = port.read(1)
response_buffer.append(char_read)
response = ''.join(response_buffer)
したがって、ここで私の要点は次のとおりです。null 許容型の言語では、この状況がinitial_value == exit_value
発生する頻度ははるかに低く、それが原因で発生しない可能性があります。None
関数が有効な状態を示すために戻る場合がまだあるため、決して起こらないと言っているわけではありません。しかし、私の急いで簡単に考えた意見では、使用した言語が意味する値を許可していない場合、この変数はまだ初期化されていません。
これは完全な推論ではありません。実際には、null 値が一般的になったため、変数が取り得る有効な値のセットのもう 1 つの要素を形成するだけです。しかし、実際には、プログラマーは、変数が適切な状態 (ループ終了状態を含む場合があります) にあるか、初期化されていない状態にあるかを区別する方法を持っています。