Rust

روز ۸: حلقه‌ها در Rust (loop، while و for)

حلقه‌ها یکی از اساسی‌ترین مفاهیم در هر زبان برنامه‌ نویسی هستند و بدون آن‌ها نوشتن برنامه‌های واقعی تقریباً غیرممکن است. در روز هشتم از مجموعه آموزش «Rust در ۵۰ روز» به سراغ حلقه‌ها می‌رویم و یاد می‌گیریم چگونه با استفاده از loop، while و for عملیات تکرارشونده را به‌صورت امن، خوانا و بهینه پیاده‌سازی کنیم. Rust در طراحی حلقه‌ها نیز همان فلسفه همیشگی خود یعنی وضوح، ایمنی و جلوگیری از خطاهای منطقی را دنبال می‌کند.

برخلاف برخی زبان‌ها که حلقه‌ها در آن‌ها می‌توانند منجر به باگ‌های پنهان، حلقه‌های بی‌نهایت ناخواسته یا دستکاری ناامن متغیرها شوند، Rust تلاش کرده ساختارهای تکرار را تا حد امکان شفاف و قابل پیش‌بینی کند. وجود سیستم مالکیت، بررسی نوع‌ها در زمان کامپایل و اجبار به صراحت در شرط‌ها باعث می‌شود حلقه‌ها در Rust بسیار قابل اعتماد باشند. همین ویژگی‌ها Rust را به گزینه‌ای عالی برای پروژه‌های بزرگ و حساس تبدیل می‌کند.

حلقه loop در Rust چیست؟

حلقه loop ساده‌ترین و در عین حال قدرتمندترین نوع حلقه در Rust است. این حلقه به‌صورت پیش‌فرض بی‌نهایت اجرا می‌شود و تا زمانی که به‌صورت صریح متوقف نشود، ادامه پیدا می‌کند. استفاده از loop معمولاً زمانی مناسب است که تعداد دفعات تکرار از قبل مشخص نیست یا خروج از حلقه به یک شرط داخلی وابسته است. Rust با طراحی دقیق loop، کنترل کامل اجرای برنامه را در اختیار توسعه‌دهنده قرار می‌دهد.

برای خروج از loop باید از دستور break استفاده کرد و در صورت نیاز می‌توان با continue اجرای تکرار فعلی را متوقف و به تکرار بعدی رفت. یکی از ویژگی‌های جذاب loop در Rust این است که می‌تواند مقدار بازگرداند. این موضوع باعث می‌شود بتوان از loop به‌عنوان یک expression استفاده کرد و نتیجه نهایی آن را در یک متغیر ذخیره کرد، قابلیتی که در بسیاری از زبان‌ها وجود ندارد یا به‌صورت غیرمستقیم پیاده‌سازی می‌شود.

let mut counter = 0;

let result = loop {
    counter += 1;

    if counter == 5 {
        break counter * 2;
    }
};

در این مثال، loop پس از رسیدن counter به عدد ۵ متوقف می‌شود و مقدار نهایی به متغیر result اختصاص داده می‌شود.

استفاده از while در Rust

حلقه while زمانی استفاده می‌شود که بخواهیم تا زمانی که یک شرط برقرار است، کدی را تکرار کنیم. این نوع حلقه برای سناریوهایی مناسب است که شرط خروج از حلقه به‌وضوح مشخص است و قبل از هر تکرار باید بررسی شود. Rust در استفاده از while نیز سخت‌گیری همیشگی خود را حفظ می‌کند و شرط حتماً باید یک مقدار بولی باشد.

حلقه while خوانایی بالایی دارد و برای کنترل جریان‌های ساده و متوسط بسیار مناسب است. از آنجا که شرط قبل از اجرای بدنه بررسی می‌شود، اگر شرط از ابتدا برقرار نباشد، بدنه حلقه حتی یک‌بار هم اجرا نخواهد شد. این رفتار باعث می‌شود منطق برنامه کاملاً قابل پیش‌بینی باشد و از اجرای ناخواسته کد جلوگیری شود.

let mut number = 3;

while number != 0 {
    println!("{}!", number);
    number -= 1;
}

در این مثال، حلقه تا زمانی که مقدار number صفر نشده است اجرا می‌شود و در هر تکرار مقدار آن کاهش پیدا می‌کند.

حلقه for در Rust و قدرت آن

حلقه for یکی از پرکاربردترین و امن‌ترین حلقه‌ها در Rust است و معمولاً برای پیمایش روی مجموعه‌ها، بازه‌های عددی و iteratorها استفاده می‌شود. Rust با طراحی for به‌گونه‌ای عمل کرده که بسیاری از خطاهای رایج مانند دسترسی خارج از محدوده آرایه‌ها به‌صورت کامل حذف شوند. این ویژگی یکی از نقاط قوت اصلی Rust در مقایسه با بسیاری از زبان‌های دیگر است.

در Rust، for به‌طور مستقیم با iteratorها کار می‌کند و این یعنی پشت صحنه یک سیستم بسیار قدرتمند و بهینه در حال اجراست. استفاده از for باعث می‌شود کدها هم خواناتر باشند و هم از نظر عملکرد بهینه‌تر عمل کنند. به همین دلیل در بیشتر مواقع توصیه می‌شود به‌جای while یا loop از for استفاده شود، مگر اینکه شرایط خاصی وجود داشته باشد.

for i in 1..=5 {
    println!("Number: {}", i);
}

این مثال نشان می‌دهد چگونه می‌توان به‌راحتی روی یک بازه عددی حلقه زد، بدون نگرانی از خطاهای منطقی.

پیمایش آرایه‌ها با for در Rust

یکی از رایج‌ترین کاربردهای حلقه for در Rust، پیمایش آرایه‌ها و vectorها است. Rust به‌طور پیش‌فرض اجازه دسترسی ناامن به عناصر را نمی‌دهد و همین موضوع باعث می‌شود استفاده از for بسیار مطمئن باشد. هنگام پیمایش، Rust مالکیت و قرض‌گیری را مدیریت می‌کند تا از بروز خطاهای حافظه جلوگیری شود.

شما می‌توانید عناصر را به‌صورت فقط‌خواندنی یا قابل تغییر پیمایش کنید و Rust به‌صورت کاملاً شفاف این موضوع را کنترل می‌کند. این سطح از کنترل باعث می‌شود حتی در پروژه‌های بزرگ و پیچیده نیز احتمال بروز باگ‌های مرتبط با حافظه به حداقل برسد.

let numbers = vec![10, 20, 30, 40];

for num in numbers {
    println!("{}", num);
}

در این مثال، تمام عناصر vector به‌ترتیب پیمایش و چاپ می‌شوند.

تفاوت loop، while و for در Rust

هر سه نوع حلقه در Rust کاربردهای خاص خود را دارند و انتخاب درست آن‌ها به سناریوی برنامه بستگی دارد. loop برای زمانی مناسب است که خروج از حلقه پیچیده یا وابسته به چند شرط داخلی باشد. while بیشتر برای شرایطی استفاده می‌شود که یک شرط مشخص، ادامه اجرای حلقه را کنترل می‌کند. for بهترین انتخاب برای پیمایش مجموعه‌ها و بازه‌ها است و معمولاً خواناترین و امن‌ترین گزینه محسوب می‌شود.

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

جمع‌بندی روز هشتم آموزش Rust

در روز هشتم با حلقه‌های Rust شامل loop، while و for آشنا شدیم و یاد گرفتیم چگونه عملیات تکرارشونده را به‌صورت ایمن و خوانا پیاده‌سازی کنیم. Rust با ارائه حلقه‌هایی قدرتمند و در عین حال ساده، کمک می‌کند کدهایی بنویسیم که هم از نظر عملکرد بهینه باشند و هم احتمال بروز خطا در آن‌ها بسیار کم باشد. تسلط بر این مفاهیم، پایه‌ای ضروری برای ورود به مباحث پیشرفته‌تر Rust است.

در روز بعدی به سراغ آرایه‌ها، vectorها و مجموعه‌های داده در Rust می‌رویم که ارتباط نزدیکی با حلقه‌ها دارند و در عمل مکمل این مبحث هستند.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

20 − 12 =

دکمه بازگشت به بالا