این تمرین بلوکهای سازندهی بنیادین Ruby را به شما آموزش میدهد. موضوعات زیادی را پوشش میدهد، اما اگر فکر میکنید طاقتفرسا است نگران نباشید؛ در ادامهی مسیر، همهچیز را بسیار عمیقتر بررسی خواهیم کرد.
یکی از نکات کلیدی دربارهی Ruby این است که Ruby یک زبان شیءگرا است و همهچیز در Ruby یک شیء است. عدد، رشته، آرایه؛ همهشان شیء هستند.
ما معمولاً با اختصاص دادن اسم به اشیاء از آنها استفاده میکنیم، چه از طریق متغیر و چه از طریق ثابت.
متغیرها همیشه با نگارش snake case نوشته میشوند.
یک متغیر میتواند در طول عمرش به اشیاء متفاوتی اشاره کند.
برای مثال، میتوان my_first_variable را بارها با عملگر = تعریف و بازتعریف کرد:
my_first_variable = 1
my_first_variable = "Some string"
my_first_variable = SomeComplexObject.new
اما ثابتها قرار است فقط یک بار مقدار بگیرند. آنها باید با حرف بزرگ شروع شوند و معمولاً بهصورت تمامحروفبزرگ نوشته میشوند، با جداسازی کلمات بهوسیلهی زیرخط. برای مثال:
MY_FIRST_CONSTANT = 10
# Redefining not allowed
# MY_FIRST_CONSTANT = "Some String"
Ruby بهصورت کلاسها سازماندهی شده است.
کلاسها با کلیدواژهی class تعریف میشوند که اسم کلاس بعد از آن میآید.
اشیاء معمولاً با نمونهسازی از کلاسها بهکمک متد .new ساخته میشوند.
برای مثال:
# Define the class
class Calculator
#...
end
# Create an instance of it and assign it to a variable
my_first_calc = Calculator.new
واحدهای کارکردی در متدها کپسوله میشوند، مشابه تابع در زبانهای دیگر.
یک متد را میتوان با آرگومانهای مکانی، با آرگومانهای کلیدواژهای (که با نحوهی نگارش : تعریف و فراخوانی میشوند) یا بدون هیچ آرگومانی تعریف کرد.
متدها یا نتیجهی آخرین دستور ارزیابیشده را بهصورت ضمنی برمیگردانند، یا میتوانند بهصورت صریح یک شیء را با کلیدواژهی return برگردانند.
class Calculator
# Positional arguments
def add(num1, num2)
return num1 + num2 # Explicit return
end
# Keyword arguments
def multiply(num1:, num2:)
num1 * num2 # Implicit return
end
end
متدها با نحوهی نگارش . فراخوانی میشوند:
calc = Calculator.new
calc.add(1, 3)
calc.multiply(num1: 2, num2: 5)
در این تمرین قرار است کدی بنویسید که به شما کمک کند تا از کتاب آشپزی محبوبتان یک لازانیای عالی بپزید.
چهار کار پیش روی شماست که همه به زمان صرفشده برای پختن لازانیا مربوط میشوند.
«ثابت» Lasagna::EXPECTED_MINUTES_IN_OVEN را تعریف کنید که برمیگرداند لازانیا باید چند دقیقه در فر بماند. طبق کتاب آشپزی، زمان مورد انتظار در فر بر حسب دقیقه ۴۰ است:
Lasagna::EXPECTED_MINUTES_IN_OVEN
# => 40
«متد» Lasagna#remaining_minutes_in_oven را تعریف کنید که تعداد دقیقههایی را که لازانیا تا الآن در فر بوده بهعنوان پارامتر میگیرد و بر اساس زمان مورد انتظار در فر از کار قبلی برمیگرداند که لازانیا باید چند دقیقهی دیگر در فر بماند.
lasagna = Lasagna.new
lasagna.remaining_minutes_in_oven(30)
# => 10
«متد» Lasagna#preparation_time_in_minutes را تعریف کنید که تعداد لایههایی را که به لازانیا اضافه کردهاید بهعنوان پارامتر میگیرد و برمیگرداند که آماده کردن لازانیا چند دقیقه از وقت شما را گرفته است، با این فرض که آماده کردن هر لایه ۲ دقیقه طول میکشد.
lasagna = Lasagna.new
lasagna.preparation_time_in_minutes(2)
# => 4
«متد» Lasagna#total_time_in_minutes را تعریف کنید که دو پارامتر نامدار میگیرد: پارامتر number_of_layers تعداد لایههایی است که به لازانیا اضافه کردهاید و پارامتر actual_minutes_in_oven تعداد دقیقههایی است که لازانیا در فر بوده است. این تابع باید برمیگرداند که در مجموع چند دقیقه روی پختن لازانیا کار کردهاید؛ یعنی مجموع زمان آمادهسازی بر حسب دقیقه و زمانی که لازانیا تا این لحظه در فر گذرانده است.
lasagna = Lasagna.new
lasagna.total_time_in_minutes(number_of_layers: 3, actual_minutes_in_oven: 20)
# => 26