লুপ হলো একটি কন্ট্রোল স্ট্রাকচার, যা একটি নির্দিষ্ট শর্তের ভিত্তিতে কোড বারবার চালানোর সুযোগ দেয়।
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 একটি এক্সপ্রেশন হিসেবে ব্যবহার করা যায়, অর্থাৎ এটি একটি ভ্যারিয়েবলের মান হিসেবেও ব্যবহার করা যায়।
যে মানটি রিটার্ন হয়, সেটি হলো break কিওয়ার্ডের সাথে দেওয়া মান।
এটি লুপের শেষ এক্সপ্রেশনের মান রিটার্ন করে না।
a = while true
break 1
end
p a
# => 1
i = 0
a = while i == 0
i += 1
1
end
p a
# => nil