break و goto در لوا

کنترل جریان حلقه‌ها با break و استفاده از goto و label ها

break — خروج از حلقه

گاهی می‌خواهید قبل از اتمام طبیعی حلقه از آن خارج شوید:

-- پیدا کردن اولین عدد بزرگ‌تر از ۵۰
for i = 1, 100 do
  if i > 50 then
    print("پیدا شد: " .. i)
    break   -- از حلقه خارج شو
  end
end

مثال: جستجو در آرایه

local numbers = {4, 8, 15, 16, 23, 42}
local target = 23
local found = nil

for i, n in ipairs(numbers) do
  if n == target then
    found = i
    break   -- دیگر لازم نیست ادامه دهیم
  end
end

if found then
  print("عدد " .. target .. " در موقعیت " .. found .. " پیدا شد")
else
  print("پیدا نشد")
end

break در حلقه‌های تو در تو

break فقط از داخلی‌ترین حلقه خارج می‌شود، نه همه!
for i = 1, 3 do
  for j = 1, 3 do
    if j == 2 then
      break   -- فقط حلقه داخلی می‌شکند
    end
    print(i, j)
  end
end
-- خروجی: 1,1  2,1  3,1

goto — پرش به برچسب

لوا (از نسخه 5.2) دستور goto دارد که به یک برچسب (label) پرش می‌کند:

for i = 1, 10 do
  if i % 2 == 0 then
    goto continue   -- پرش به انتها
  end
  print("فرد: " .. i)
  ::continue::      -- برچسب
end

الگوی continue با goto

لوا دستور continue ندارد! اما با goto می‌توان ساخت:

local numbers = {1, -2, 3, -4, 5, -6}

for i, n in ipairs(numbers) do
  if n < 0 then
    goto skip   -- عدد منفی را رد کن
  end
  print("مثبت: " .. n)
  ::skip::
end

قوانین goto

استفاده زیاد از goto کد را «کد اسپاگتی» می‌کند! فقط برای الگوهای استاندارد (مثل continue) از آن استفاده کنید.

خروج از حلقه‌های تو در تو با goto

::outer::   -- برچسب بیرونی

for i = 1, 5 do
  for j = 1, 5 do
    if i * j > 6 then
      print("یافت شد: " .. i .. " × " .. j)
      goto outer   -- از هر دو حلقه خارج شو!
    end
  end
end

این مبحث بخشی از دوره آموزش کامل لوا است.

ابزارهای مرتبط