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
- برچسبها با
::name::تعریف میشوند - نمیتوانید به داخل scope یک متغیر محلی پرش کنید
- استفادههای رایج: شبیهسازی continue و خروج از حلقههای تو در تو
استفاده زیاد از 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
این مبحث بخشی از دوره آموزش کامل لوا است.