حلقه یک ساختار کنترلی است که اجازه میدهد کد بر اساس یک شرط مشخص، بارها اجرا شود.
حلقهی While یک ساختار کنترلی است که اجازه میدهد کد بر اساس یک شرط مشخص بارها اجرا شود. کدی که درون حلقهی While قرار دارد، تا زمانی که شرط «درست» ارزیابی شود، به اجرا ادامه میدهد. از حلقههای While غالباً زمانی استفاده میشود که تعداد تکرارها از پیش مشخص نیست؛ با این حال، در هر موقعیتی که به یک حلقه نیاز باشد میتوان از آن بهره برد.
شرط پیش از اجرای کد درون حلقه ارزیابی میشود؛ یعنی اگر شرط «غلط» باشد، کد درون حلقه هرگز اجرا نخواهد شد.
i = 0
while i < 3
puts i
i += 1
end
# Output:
# 0
# 1
# 2
وقتی میخواهید روی یک رشته پیمایش کنید، میتوانید روی طول رشته حلقه بزنید.
str = "Hello"
i = 0
while i < str.size
puts str[i]
i += 1
end
# Output:
# H
# e
# l
# l
# o
حلقههای Until همانند حلقههای While کار میکنند، با این تفاوت که کد درون حلقه تا زمانی که شرط «درست» ارزیابی شود به اجرا ادامه میدهد.
این همانند تفاوت میان if و unless است.
i = 0
until i == 3
puts i
i += 1
end
یک خطای رایج در حلقههای While، ورود به «حلقهی بینهایت» است؛ حلقهای که هرگز پایان نمییابد. حلقهی بینهایت میتواند ناشی از این باشد که شرط هرگز به «درست» یا «غلط» ارزیابی نمیشود. این غالباً ناشی از خطای برنامهنویس است؛ برای نمونه، فراموش کردن افزایش متغیر حلقه. اما گاهی یک حلقهی بینهایت روشنترین راه برای پیادهسازی منطق برنامه است. یا اینکه حلقه زدن تا ابد ضروری است؛ برای نمونه، یک سرور HTTP منتظر یک اتصال ورودی میماند، آن را مدیریت میکند و سپس منتظر اتصال بعدی میماند.
از کلیدواژهی break میتوان برای خروج زودهنگام از یک حلقه استفاده کرد.
این میتواند زمانی مناسب باشد که بخواهید تحت شرایط مشخصی زودتر از حلقه خارج شوید.
i = 0
while i <= 3
puts i
i += 1
if i == 2
break
end
end
# Output:
# 0
# 1
از کلیدواژهی next میتوان برای پرش به تکرار بعدی یک حلقه استفاده کرد.
این میتواند زمانی مناسب باشد که بخواهید از تکرارهای مشخصی از یک حلقه بگذرید.
i = 0
while i <= 3
i += 1
if i == 2
next
end
puts i
end
# Output:
# 1
# 3
نوع متغیر میتواند هنگام حلقهزدن متفاوت باشد.
در نمونهی زیر، نوع a برابر با Int32 | String است، چون در بخش نخست حلقه میتواند Int32 یا String باشد.
متغیر a تنها در بخش نخست حلقه نوع Int32 | String را حمل میکند، چون هنگام شروع حلقه مقدار Int32 را در خود دارد و در تکرار دوم یک String را نگه میدارد.
این سیستم چندنوعی بعداً بهتفصیل توضیح داده خواهد شد.
اما چون مطمئنیم که بخش دوم حلقه تنها String را نگه میدارد، نوع a در بخش دوم حلقه String است.
در زمان اجرا، هرگز همزمان Int32 و String را نگه نمیدارد.
i = 0
a = 4
while i < 3
p typeof(a)
# => Int32 | String
a = "4"
p typeof(a)
# => String
i += 1
end
while بهعنوان یک عبارتاز while میتوان بهعنوان یک عبارت استفاده کرد، یعنی میتوان از آن بهعنوان مقدار یک متغیر بهره برد.
مقداری که بازگردانده میشود، همان مقداری است که با کلیدواژهی break داده شده است.
مقدار آخرین عبارت درون حلقه را بازنمیگرداند.
a = while true
break 1
end
p a
# => 1
i = 0
a = while i == 0
i += 1
1
end
p a
# => nil