زبان روبی: ادامه تا شرطی ها

درود بر یاران. من واقعا به خاطر اینکه از برنامه عقب افتادیم و از ۱۰ خرداد آموزش ها یه توقفی داشتند شرمنده ام و عذرخواهی میکنم. ولی من نوشتن این مقاله کوچیک رو وظیفه خودم میدونم و امیدوارم سواد شمارو بیشتر کنم و مسیر شمارو برای پیشرفت هموار کنم.



در ادامه سعی داریم در مورد برنامه نویسی منطقی رو یاد بگیریم که یکی از مهم ترین بخش های یک زبان برنامه نویسی هستند و امیدوارم این مقاله رو با دقت بخونید.

میتونید قسمت قبلی رو از اینجا دنبال کنید:

https://virgool.io/ruby-lang/%D8%B2%D8%A8%D8%A7%D9%86-%D8%B1%D9%88%D8%A8%DB%8C-%D9%87%D8%B4-%D9%87%D8%A7-btbxoji2kejv




بولین ها یا داده های منطقی:

برای یادآوری و توضیحات بیشتر میخوام این قسمت رو برای مقادیر منطقی تخصیص بدم و میخوام کلشون تو یه قسمت باشند پس حتما بخونید.

در هر زبان برنامه نویسی نوعی داده داریم که درست یا نادرست بودن رو در خودش ذخیره میکنه. از این داده ها میتونید برای ذخیره درستی انجام یک رویداد استفاده کنید. و فقط میتونید دو نوع داده رو در این متغییر ها جای بگذارید. True(درستی) و False(نادرستی) دو نوع داده ای هستند که میتونید استفاده کنید. اگر مثل من ریاضی خونده باشید در مورد ترکیب های عطفی و فصلی خوندید که در ادامه به انها اشاره خواهیم داشت.


مثل گذشته برای تعریف بولین نام اون رو مینویسید و مقدار اون رو با مساوی مینویسید:


درضمن شما نمیتونید بولی هارو باهم جمع یا ضرب یا هر عملیات ریاضی روش انجام بدید. درضمن نقیض یک گزاره یا بولی رو هم میتونید با علامت ! یا اکسکلمیشن مارک یا همون علامت تعجب خودمون تایین کنید:

میبینید که اگه علامت تعجب رو پشت یه داده یا متغیر بگذارید مقدار اون رو برعکس میکنه(درست رو نادرست و نادرست رو درست). درضمن در خط پنچم سردرگم نشید که چرا ! به مساوی چسبیده. میتونید اون رو به مساوی بچسبونید یا به نام متغییر ایرادی نداره. میتونید بر حسب سلیقه خودتون نکنید. ولی این کار خوانایی کد رو بالا میبره.

درضمن عملگر != رو با =! اشتباه نگیرید چون =! برای مقایسه نابرابری دو گزاره هست و اگر دو گزاره باهم نابرابر بودند مقدار صحیح برگردونده میشه. درضمن == و === برای مقایسه برابری دوتا گزاره استفاده میشه.

اون چیزای مشکی پشت ترمینال رو هم نگاه نکنید. گفتم که بدونید ;)
اون چیزای مشکی پشت ترمینال رو هم نگاه نکنید. گفتم که بدونید ;)


درضمن < و > و => و =< به ترتیب بزرگتر, کوچکتر, کوچکتر مساوی و بزرگتر مساوی هستند که برای مقایسه مقادیر عددی استفاده میشند:


ترکیب های عطفی و فصلی:

وقتی در هنگام مقایسه بخوایم چندتا مقایسه رو انجام بدیم طوری که پاسخ همشون باهم در ارتباط باشند از ترکیب های فصلی و عطفی استفاده میکنیم. ترکیب های عطفی طوری هستند که در هنگامی که پاسخ همه مقایساتمون درست یا True باشند مقدار True برمیگردونه. برای راهنمایی بیشتر جدولی از گوگول پایین ضمیمه کردم.

ترکیب های عطفی رو با "و" و یک علامت شبیه به ۸ مینویسند و ترکیب های فصلی که بهش میگند "یا" رو با علامت شبیه به ۷ مشخص میکنند. امیدوارم از جدولی که از گوگول براتون گذاشتم به مشکل بر نخورده باشید:

درضمن علامت تیلد ~ هم نقیض یک گزاره میشه.

خوب از فضای آمار و احتمالی رد بشیم و برسیم به کد زدن. در زبان های برنامه نویسی "یا" یا ترکیب های فصلی رو با ||(کنار enter دکمه شیفت رو بگیرید بک اسلش رو بزنید) و ترکیبات عطفی رو با && مینویسند و پاسخ چیزی شبیه به جدول بالا خواهد بود:

خط ۳ رو از من به خاطر یه تمرین قبول کنید و تو ذهنتون حلش کنید.

شرطی ها(با خط بزرگ و خوانا):

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

همین طور که میبینید ظرططون رو در جلوی if میذارید و بعد عملیاتی که میخواید انجام بدید رو مینویسید و سپس end رو مینویسید. مثال:

درضمن از این به بعد در داخل irb کار نمیکنیم و زین پس فقط خروجی کار رو به همراه کد براتون میذارم.

یک دستور دیگر به نام else داریم که در صورت عمل نکردن شرط قبلیش کار میکنه. و فقط وقتی شرط قبلی عمل نکرد کد داخلش اجرا میشه. پس نیازی به نوشتن شرط بعد از اون نیست. برای اینکار باید آخر شرط قبل از end این کارو میکنیم:

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

یه شیوه دیگر هم داریم وقتی شرط ها زیاد شد میتونیم از else if استفاده کنیم. اون رو هم باید قبل از else به کار ببندیم. و باید جلوش شرطمون رو بنویسیم. فقط دقت کنید که چون سازنده زبان ژاپنی بوده همیجوری elsif نوشته. شما هم باید اینجوری بنویسید:


یه نوع از شرط ها هم که معروفند بهش میگند ternery operators که میتونید تو یه لاین شرطتون رو بنویسید:

[statement] if [condition]

مثال:

اون قسمتی که هایلایت کردم statement هست و شرط هم بعد if هست.

یه نوع دیگر شرطی ها هست به نام unless که شبیه به if است ولی برعکسش. و با ! if برابر هست:

unless [codation]
    [statement]
else
    [statement]
end

یعنی به جای اینکه از مدل پایین استفاده کنیم میتونیم از این روش استفاده کنیم.

num = 3
if num != 3
    puts "number is not 3"
end


switch-case statement:

مواقعی پیش میاد که لازم میشه شما برای تک تک داده ها یک شرط جداگانه تعریف کنید و elsif های پی در پی رو به کار میبرید. سوءیچ کیس ویژگیش برای همین مواقع هست:

case expression
when [expression] [, expression]
    [statement]
[else]
    [statement]
end

همونطور که میبینید متغییری که میخواید داده هاش رو چک کنید رو جلوی cas

که اگر از case استفاده نمیکردید باید همچین چیزی مینوشتید:

در اینجا شرطی هارو تموم میکنیم ولی یک نکته کوچیک میمونه: محدوده ها

Ranges:

رنج ها نوعی داده هستند که دامنه ای از اعداد رو برای شما برمیگردونند. برای مثال وقتی که بخوایم یک آرایه بسازیم که تا ۱ تا ملیون باشه خیلی وقت میبره. برای همین رنج ها رو داریم که آرایه ای از اعداد رو در خود ذخیره میکنند.

برای تعریف رنج باید مثل سینتکس پایینی عمل کنید:

[name] = [starting point]..[end point]

که [starting point] نقطه آغاز و [end point] نقطه پایان محدوده هست. برای مثال بخوایم اعدادی در دامنه ۰ تا ۱۰ رو ذخیره کنیم:

ما دو نوع رنج داریم که مثل هم هستند ولی یک نکته کوچیک دارند. ابتدار نام هر دو رو مینویسیم:

  • Inclusive Range
  • Exclusive Range

اولین نوع رنج ها به گونه ای است که از عدد اول تا عدد دوم آرایه میسازه. ولی در نوع دوم از اولین عدد تا یک عدد قبل تر از عدد دوم آرایه میسازه.

درضمن میبینید که اون جوابی که دلخواه شماست رو نمیده و ارایه رو برنمیگردونه. و کل اجزاش رو چاپ نمیکنه. ولی در خط ۵ میبینید که کلاس متغیر range هست. نکته دیگر این است که نمیتونید مستقیما بعد از اینکه رنج رو تعریف کردید جلوش "." بذارید و از متود هاش استفاده کنید. چون کامپایلر در اینجا خطا میده و برای حل مشکل میتونید رنج رو در پارانتز بذارید یا در خط دیگر از متود استفاده کنید:

میبینید که وقتی رنج رو در پارانتز میذاریم ارور برطرف میشه.

چندتا متود از رنج ها هم هستند که در ادامه براتون توضیح خواهیم داد.

begin & first:

این متود ها اولین عدد از رنج رو برمیگردونند و فرقی باهم ندارند:

end & last:

این متود ها هم آخرین عضو از رنج رو برمیگردونند:

در اینجا نکته عجیب اینست که وقتی از تابع end یا last در range_2 استفاده میکنیم که exclusive range هست به جای اینکه ۹ رو چاپ کنه ۱۰ رو چاپ میکنه. این توابع فقط عدد دومی که هنگام ساخت رنج نوشتیم رو نشون میدند و تبدیل به آرایه نمیکنندش. برای اینکه برامون ثابت بشه که عدد ۱۰ در range_2 نیست کد زیر رو نگاه کنید:

از تابع ?include برای فهمیدن اینکه آیا این مقدار در آرایه یا رنج وجود دارد استفاده میشه. همینطور که میبینید در range_1 که اینکلوسیو هست عدد ۱۰ وجود داره. ولی در range_2 که اکسلیوسیو هست عدد ۱۰ وجود نداره. درضمن در بعضی از متود ها اگر جلوشون ? بذارید جواب رو به صورت بولی برمیگردونند:

میبینید که جواب هایی که انتظار داریم رو برمیگردونند.

برای اینکه بخواید اجزای رنج رو باز کنید و به صورت آرایه نشون بدید میتونید نام متغیر رو داخل اسکور براکت بزارید و قبل از اون اشتریسک یا splat oprator یا همون ستاره خودمون رو بذارید:

درضمن رنج ها میتونند از حروف هم تشکیل بشند. اگر بخوایم نمایش بدیم حروف به صورت الفبا از اول به آخر چاپ میشوند:



تمرین:

برای تمرین میخوایم یک برنامه ای بسازیم که رده سنی افراد رو مشخص کنه:

میبینید که وقتی از when استفاده میکنیم جلوش یک رنج استفاده کردیم که حتی میتونستید شرط هاتون رو با کاما از هم جدا کنید. ولی برای داده های بزرگتر این مناسب نیست و ما هم از همین رنج استفاده میکنیم.

میتونید معادل این برنامه رو به روش سنتی که با چیدن چند شرط پشت هم نیز این کارو بکنید. فقط باید در هنگام گذاشتن شرط از تابع ?include استفاده کنید. این رو به عنوان یک تمرین دیگر از من بپذیرید.




امیدوارم که خوندن مطلب براتون سخت نباشه و اگر مشکلی براتون پیش اومد در کامت ها بپرسید. نظرات شما باعث دلگرمی منه و امید و انرژی برای نوشتن مقالات دیگر. درضمن امیدوارم مقاله رو خوب بخونید چون از دیشب هست دارم مینویسم. لایک و کامنت هم یادتون نره.

پیروز و پاینده باشید. بدرود