حل

حلقه‌ی While در Crystal

1 تمرین

درباره‌ی حلقه‌ی While

حلقه یک ساختار کنترلی است که اجازه می‌دهد کد بر اساس یک شرط مشخص، بارها اجرا شود.

حلقه‌ی While

حلقه‌ی 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

حلقه‌های Until همانند حلقه‌های While کار می‌کنند، با این تفاوت که کد درون حلقه تا زمانی که شرط «درست» ارزیابی شود به اجرا ادامه می‌دهد. این همانند تفاوت میان if و unless است.

i = 0
until i == 3
  puts i
  i += 1
end

حلقه‌ی بی‌نهایت

یک خطای رایج در حلقه‌های While، ورود به «حلقه‌ی بی‌نهایت» است؛ حلقه‌ای که هرگز پایان نمی‌یابد. حلقه‌ی بی‌نهایت می‌تواند ناشی از این باشد که شرط هرگز به «درست» یا «غلط» ارزیابی نمی‌شود. این غالباً ناشی از خطای برنامه‌نویس است؛ برای نمونه، فراموش کردن افزایش متغیر حلقه. اما گاهی یک حلقه‌ی بی‌نهایت روشن‌ترین راه برای پیاده‌سازی منطق برنامه است. یا این‌که حلقه زدن تا ابد ضروری است؛ برای نمونه، یک سرور HTTP منتظر یک اتصال ورودی می‌ماند، آن را مدیریت می‌کند و سپس منتظر اتصال بعدی می‌ماند.

break

از کلیدواژه‌ی break می‌توان برای خروج زودهنگام از یک حلقه استفاده کرد. این می‌تواند زمانی مناسب باشد که بخواهید تحت شرایط مشخصی زودتر از حلقه خارج شوید.

i = 0
while i <= 3
  puts i
  i += 1
  if i == 2
    break
  end
end

# Output:
# 0
# 1

next

از کلیدواژه‌ی 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
ویرایش از طریق GitHub این پیوند در پنجره یا زبانه‌ی جدیدی باز می‌شود

حلقه‌ی While را یاد بگیرید

تمرین کردن قفل شده است

برای تمرین حلقه‌ی While قفل 10 تمرین دیگر را باز کنید