whileループとrepeat-untilループ
条件に基づく反復処理にwhileとrepeat-untilを使用します。
「whileループとrepeat-untilループ」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。
whileループ
whileループは、条件が真値である間、本文を繰り返し実行します。条件は各反復の前に確認されます。最初から条件が偽の場合、本文は一度も実行されません。無限ループを避けるため、ループが終了条件に向かって必ず進むようにしてください。
local count = 1
while count <= 5 do
print(count)
count = count + 1
end
-- prints 1 through 5repeat-untilループ
repeat...untilループは、Luaにおけるdo-whileに相当します。少なくとも1回は本体を実行し、各反復の後に条件を確認します。条件がtrueになるとループを終了します(whileとは逆です)。本体内で宣言した変数は条件式から参照できます。
local n = 1
repeat
print(n)
n = n * 2
until n > 100
-- prints: 1, 2, 4, 8, 16, 32, 64breakを使った無限ループ
イベントループや再試行パターンでは、while true doと、条件を満たしたときに終了するbreakを組み合わせて使用します。このパターンは、継続的に動作するゲームのメインループやネットワークサーバーでよく使われます。
local attempts = 0
local MAX = 3
while true do
attempts = attempts + 1
print("Attempt " .. attempts)
if attempts >= MAX then
print("Max attempts reached")
break
end
endwhileによるカウントダウン
whileループは、値を減らしながら数える場合にも同じように使えます。重要なのは、最終的に終了条件を満たすように変数を更新することです。カウンターの更新を忘れると、無限ループになることがよくあります。
local i = 10
while i > 0 do
io.write(i .. " ")
i = i - 1
end
print() -- newline
-- output: 10 9 8 7 6 5 4 3 2 1入力検証におけるrepeat-until
repeat-untilパターンは、入力検証に最適です。まず1回入力を求め、その後で確認します。このパターンでは本体が必ず少なくとも1回実行されるため、「尋ねてから検証する」という自然な流れに適しています。
-- Simulated input validation
local inputs = {-1, 0, 5} -- pretend user input
local idx = 0
local value
repeat
idx = idx + 1
value = inputs[idx]
print("Got: " .. value)
until value > 0
print("Valid value: " .. value) -- 5ループ変数はローカル
ループ本体内でlocalを使って宣言した変数は、反復ごとに再作成されます。これは、クロージャでループ変数をキャプチャするときに重要です。各クロージャがそれぞれ独自のコピーをキャプチャします。ループの外で宣言した変数は、反復をまたいで保持されます。
local callbacks = {}
for i = 1, 3 do
local captured = i -- local per iteration
callbacks[i] = function() return captured end
end
print(callbacks[1]()) -- 1
print(callbacks[2]()) -- 2
print(callbacks[3]()) -- 3アキュムレータパターン
whileループの一般的な用途の1つは、結果を蓄積することです。合計、積、文字列の連結、テーブルの構築はすべてアキュムレータパターンに従います。ループの前に初期化し、ループ内で更新し、ループの後で結果を使用します。
local numbers = {3, 1, 4, 1, 5, 9, 2, 6}
local sum = 0
local i = 1
while i <= #numbers do
sum = sum + numbers[i]
i = i + 1
end
print("Sum:", sum) -- 31
print("Avg:", sum / #numbers) -- 3.875入れ子になったループ
ループは入れ子にできます。各ループは独自のカウンターを管理します。分かりやすさのため、説明的な変数名を使用してください。break文が終了するのは、最も内側にある囲いのループだけです。複数のレベルから抜けるには、フラグ変数またはgoto(Lua 5.2以降)が必要になる場合があります。
local found = false
local target = 6
local i = 1
while i <= 3 and not found do
local j = 1
while j <= 3 do
if i * j == target then
print(i .. " * " .. j .. " = " .. target)
found = true
break
end
j = j + 1
end
i = i + 1
end複数レベルのbreakに使うgoto
Lua 5.2以降では、ラベルを付けた位置へジャンプするためのgotoが導入されました。一般には使用が推奨されませんが、フラグ変数を使わずに入れ子のループからきれいに抜ける方法として、適切な場合があります。ラベルは::name::で定義します。
for i = 1, 5 do
for j = 1, 5 do
-- goto only valid approach for nested break in Lua
if i * j > 10 then
goto done
end
io.write(i*j .. " ")
end
end
::done::
print()
print("Stopped early")whileとrepeatの使い分け
while:0回の反復になる可能性がある場合に使います。最初に条件を確認します。repeat-until:少なくとも1回は反復する必要がある場合に使います。後で条件を確認します。ほとんどのループではwhileを優先してください。メニュー、入力要求、アクションを実行してから確認する必要がある再試行ループにはrepeat-untilを使います。
-- while: may execute zero times
local ready = false
while ready do
print("never prints")
end
-- repeat-until: always executes at least once
local done = false
repeat
print("runs once even though done=false")
done = true
until doneクイックチェック
repeat...untilループでは、条件はいつ確認されますか?
振り返り:whileとrepeat-until
重要なポイント:
while cond do ... end— 先に確認するため、まったく実行されない場合があるrepeat ... until cond— 後で確認するため、少なくとも1回は実行されるbreakは最も内側のループを終了するgoto ::label::で入れ子のループから抜けられる(Lua 5.2以降)- ループ内のローカル変数は反復ごとに再作成される
- 結果を構築するにはアキュムレータパターンを使う
よくある質問
「whileループとrepeat-untilループ」レッスンは無料ですか?
はい。「whileループとrepeat-untilループ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。
「whileループとrepeat-untilループ」で何を学びますか?
条件に基づく反復処理にwhileとrepeat-untilを使用します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Lua Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「whileループとrepeat-untilループ」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLua Academyレッスンでコードを書いて実行できますか?
はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- if、elseif、else文
- whileループとrepeat-untilループ
- 数値forループ
- ジェネリックforとbreak