آموزش زبان برنامه‌نویس Rust - قسمت۴: دستور شرطی if

حالا که با مفاهیم خیلی پایه‌ای آشنا شدیم, وقت آن است که به سراغ شرط‌ها و حلقه‌ها برویم. چیزهایی که بدون آن‌ها نوشتن برنامه‌های واقعی امکان ندارد.

اگر از ابتدا با این دوره‌ی آموزشی همراه نبوده‌اید, با کلیک روی این متن به جلسه‌ی اوّل بروید.

دستور شرطی if

دستور شرطی if تقریباً در تمام زبان‌های برنامه‌نویسی وجود دارد. به همین دلیل به احتمال خیلی زیاد با آن آشنایی دارید.

هر دستور if یک شرط دارد. اگر حاصل آن شرط درست بود, کدهای داخل بدنه‌ی if اجرا می‌شوند. در غیر این صورت, کدهای داخل بدنه‌ی دستور else اجرا می‌شوند.

مثال زیر را ببینید:

fn main() {
    let a = 5;
    if a < 10{
        println!(&quotشرط درست است&quot);
    }
    else{
        println!(&quotشرط اشتباه است&quot);
}

چون ۵ از ۱۰ کوچکتر است, پس کد درون بدنه‌ی if اجرا می‌شود:

شرط درست است

حالا اگر مقدار متغیّر a را تغییر دهیم و آن را برابر با ۱۰ قرار دهیم چه اتّفاقی می‌افتد؟ همانطور که حدس می‌زنید کد درون بدنه‌ی else اجرا می‌شود(چون شرط if اشتباه می‌شود و دیگر برقرار نیست) و عبارت زیر در خروجی نوشته می‌شود:

‌شرط اشتباه است

هنگام کار با دستور if باید به چند نکته توجّه کنید:

۱- وجود دستور else الزامی نیست. اگر دستور else نباشد, وقتی که شرط if اشتباه شد برنامه کدهای درون آن را نادیده می‌گیرد و از بعد از آن ادامه پیدا می‌کند.

۲-در زبان Rust لزومی ندارد که شرط درون پرانتز باشد. امّا گاهی اوقات, مخصوصاً زمانی که داریم از شرط‌های ترکیبی استفاده می‌کنیم, مجبور می‌شویم که از پرانتزها استفاده کنیم.

۳-حاصل عبارت شرط باید یک مقدار بولی باشد. در زبان Rust تنها از مقادیر بولی می‌توان به عنوان شرط استفاده کرد. یعنی نمی‌توانید یک عدد یا استرینگ‌را به عنوان شرط قرار دهید.

مثال زیر را ببینید:

fn main() {
    let condition = 1;
    if condition {
        println!(&quotاین نوشته هیچ‌وقت چاپ نمی‌شود. چون این برنامه هنگام کامپایل به ارور می‌خورد&quot);
    }
}

حالا وقتی که می‌خواهیم این برنامه‌را کامپایل کنیم, به ارور زیر برخورد می‌کنیم:

error[E0308]: mismatched types
 --> src/main.rs:3:8
  |
3 |     if condition {
  |        ^^^^^^^^^ expected bool, found integral variable
  |
  = note: expected type `bool`
             found type `{integer}`

ما با دستور if می‌توانیم به راحتی برنامه‌را شاخه‌بندی کنیم و با توجّه به شرایط, تنها یک بخش از این شاخه‌هارا اجرا کنیم.

مدیریت شرط‌های چندگانه

فرض کنید ما باید چند شرط را بررسی کنیم و هرکدام که درست بود, یک مجموعه کد مجزا را اجرا کنیم.

برای این کار هم درست مانند قبل عمل می‌کنیم, با این تفاوت که برای شرط‌های دوم به بعد از دستور else if استفاده می‌کنیم.

برای اینکه بهتر متوجّه شوید به این مثال توجّه کنید:

برنامه‌ای داریم که در آن می‌خواهیم وضعیت کاربر را بررسی کنیم. اگر کاربر admin بود, به او بگوییم که می‌تواند تنظیمات‌را تغییر دهد. اگر کاربر ثبت نام کرده بود به او خوش‌آمد بگوییم. اگر هم کاربر ثبت نام نکرده بود از او بخواهیم که ثبت نام کند.

برای این کار می‌توان برنامه‌ی زیر را نوشت:

// Lines starting like this are comments.

fn main() {
    let user_type = &quotGuest"

    if user_type == &quotAdmin&quot{    // Current user is the admin of this system. So be polite and give him/her full control of everything.

        // If you have to split the string line in multiple lines, you should add \ character at the
        // end of each of them. If you don't, the compiler can not recognize that those lines are a single string.
        println!(&quotHello dear Admin. You have full access to all the settings and you can change \
                  them if you want.&quot);
    }
    else if user_type == &quotMember&quot{  // Current user is a registered member but is not admin.
        println!(&quotWelcome our beautiful member!❤️&quot);
   }
    else if user_type == &quotGuest&quot {  // Current user is not registered.
        println!(&quotPlease register dear guest.&quot);
    }
    else{       // This user is a strange one. We should call the police.
        println!(&quotI can not understand who you are. Get out right now.&quot);
    }
}

خب اگر این برنامه‌را کامپایل و اجرا کنیم, خروجی زیر را خواهیم گرفت:

Please register dear guest.

پیشنهاد: مقدار متغیّر user_type را با توجّه به شرط‌ها تغییر بدهید و خروجی‌های مختلف‌را مشاهده کنید.

مقدار دهی متغیّرها با استفاده از if

احتمالاً با عملگر سه‌تایی در بقیه‌ی زبان‌ها مثل c آشنا هستید. مثلاً اگر یک شرط برقرار بود متغیّر یک مقدار بگیرد, اگر برقرار نبود مقداری دیگر.

مثلاً در کد زیر به زبان c اگر شرط برقرار باشد مقدار متغیّر برابر ۰ خواهد بود. اگر نه عدد ۱ در آن ذخیره می‌شود:

int a = condition ? 0 : 1

خب ما در زبان Rust دقیقاً این عملگر را نداریم. امّا با استفاده از if می‌توانیم همچین کاری بکنیم. در‌واقع دستور if می‌تواند مقادیر را برگرداند و یک expression به‌حساب می‌آید(با expression در جلسات بعدی به صورت کامل آشنا می‌شویم).

فرض کنید می‌خواهیم دقیقاً همان کد بالا را به زبان Rust بنویسم. حاصل می‌شود این:

let a = if condition {
    0
}
else{
    1
};

در این کد دو تا نکته هست که باید خیلی به آن‌ها توجّه کنید. اوّل اینکه خط آخر, هم در بدنه‌ی if و هم در بدنه‌ی else , که مقداری است که باید در متغیّر ذخیره شود, در پایان ; ندارد.

اگر آخر آن خطوط ; بگذارید دیگر کار نخواهد کرد.

دوم هم اینکه بعد از آکولاد else علامت ; قرار می‌گیرد. این کار باعث می‌شود که کامپایلر بفهمد مقداردهی به متغیّر کجا تمام می‌شود.

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

اگر جایی سؤالی داشتید یا چیزی برایتان گنگ بود در بخش نظرات بپرسید.

تا جلسه‌ی بعدی بدرود.

می‌توانید نسخه‌ی ویدیویی این آموزش را اینجا ببینید:

https://www.youtube.com/watch?v=7wGk2sL973k&t=7s



این نوشته چندین روز قبل از انتشار در ویرگول, در بلاگ شخصی من منتشر شده است. برای خواندن آن و مطالب جدید دیگر روی این نوشته کلیک کنید.


خواندن قسمت قبلی