0Pricing
Lua Academy · レッスン

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 5

repeat-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, 64

breakを使った無限ループ

イベントループや再試行パターンでは、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
end

whileによるカウントダウン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. if、elseif、else文
  2. whileループとrepeat-untilループ
  3. 数値forループ
  4. ジェネリックforとbreak
← Lua Academyに戻る