مسیرها
/
Crystal
Crystal
/
تمرین‌ها
/
لازانیای شگفت‌انگیز آری
لازانیای شگفت‌انگیز آری

لازانیای شگفت‌انگیز آری

تمرین یادگیری

مقدمه

شروع به کار

متغیر

برای تعریف متغیر از عملگر انتساب = استفاده کنید. در Crystal، متغیر باید از قالب snake_case پیروی کند.

number = 1
puts number # => 1

number = 2
puts number # => 2

ثابت

ثابت با همان عملگر انتساب = تعریف می‌شود، اما از حروف بزرگی استفاده می‌کند که با نام SCREAMING_SNAKE_CASE شناخته می‌شود.

NUMBER = 1
puts NUMBER # => 1

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

NUMBER = 1

NUMBER = 2
# Error: already initialized constant NUMBER

نوع داده

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

متد

متد روشی برای گروه‌بندی مجموعه‌ای از دستورهاست که می‌توان دوباره از آن استفاده کرد. در Crystal، متدها معمولاً درون یک کلاس، ماژول یا ساختار تعریف می‌شوند. اما متد می‌تواند بیرون از یک کلاس، ماژول یا ساختار هم تعریف شود. متدها با کلیدواژه‌ی def و سپس اسم متد تعریف می‌شوند. در Crystal، متد باید با snake_case نوشته شود. وقتی متد هیچ آرگومانی ندارد، می‌توانید پرانتز را حذف کنید. برای مشخص کردن پایان متد، باید از کلیدواژه‌ی end استفاده کنید.

def hello
  puts "Hello World!"
end

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

number = 1
number + "1"
# Error: no overload matches 'Int32#+' with type String

آرگومان

متد می‌تواند آرگومان داشته باشد. آرگومان‌ها داده‌هایی هستند که به متد داده می‌شوند. برای اینکه بتوانید به متد آرگومان بدهید، باید اسم آرگومان را مشخص کنید. در Crystal، آرگومان باید با snake_case نوشته شود. یک متد می‌تواند چندین آرگومان داشته باشد، اما باید آرگومان‌ها را با ویرگول از هم جدا کنید.

def hello(name)
  puts "Hello #{name}!"
end

متد می‌تواند چندین آرگومان داشته باشد. در این حالت، آرگومان‌ها باید با ویرگول از هم جدا شوند.

def hello(name, language)
  puts "Hello #{name}! You are learning #{language}."
end

فراخوانی متد

وقتی متدی را فراخوانی می‌کنید که به یک کلاس، ماژول یا ساختار تعلق دارد، باید از عملگر نقطه (.) استفاده کنید. قالب آن باید به این صورت باشد: <ClassName>.<method_name>. وقتی متدی به کلاس، ماژول یا ساختاری تعلق ندارد، کافی است آن را با نوشتن اسمش فراخوانی کنید. متدها همیشه به‌صورت ضمنی مقدار آخرین عبارت را برمی‌گردانند.

وقتی متد آرگومان دارد، می‌توانید هنگام مشخص کردن آرگومان‌ها در فراخوانی و تعریف متد از پرانتز استفاده کنید، به این صورت: <method_name>(<argument_1>, <argument_2>, ...). وقتی متد هیچ آرگومانی ندارد، باید پرانتز را حذف کنید.

def hello(name)
  "Hello #{name}!"
end

hello("Crystal")
# => Hello Crystal!

وقتی متدی را با چندین آرگومان فراخوانی می‌کنید، باید آرگومان‌ها را با ویرگول از هم جدا کنید. آرگومان‌ها باید به همان ترتیبی داده شوند که در تعریف متد آمده‌اند.

def hello_language(name, language)
  "Hello #{name}! You are learning #{language}."
end

hello_language("World", "Crystal")
# => Hello World! You are learning Crystal.

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

hello_language("Crystal")
# wrong number of arguments for 'hello_language' (given 1, expected 2)

جمع، تفریق و ضرب

در Crystal، می‌توانید با عملگر + دو عدد را با هم جمع کنید. همچنین می‌توانید با عملگر - دو عدد را از هم کم کنید. و می‌توانید با عملگر * دو عدد را در هم ضرب کنید.

1 + 1
# => 2

2 - 1
# => 1

2 * 2
# => 4

توضیح

در Crystal، توضیحات با نویسه‌ی # نوشته می‌شوند، که پس از آن یک فاصله و سپس متن توضیح می‌آید. از توضیحات برای مستندسازی کد استفاده می‌شود. کامپایلر توضیحات را اجرا نمی‌کند.

# This is a comment

دستورالعمل‌ها

در این تمرین، کدی می‌نویسید که به شما کمک می‌کند از کتاب آشپزی محبوبتان یک لازانیای عالی بپزید.

چهار کار پیش رو دارید که همگی به زمان صرف‌شده برای پخت لازانیا مربوط می‌شوند.

1. زمان مورد انتظار پخت در فر را بر حسب دقیقه تعریف کنید

ثابت EXPECTED_MINUTES_IN_OVEN را در کلاس Lasagna تعریف کنید؛ این ثابت نگه می‌دارد که لازانیا چند دقیقه باید در فر بماند. بر اساس کتاب آشپزی، زمان مورد انتظار پخت در فر ۴۰ دقیقه است:

Lasagna::EXPECTED_MINUTES_IN_OVEN
# => 40

2. زمان باقی‌مانده‌ی پخت در فر را بر حسب دقیقه محاسبه کنید

متد Lasagna#remaining_minutes_in_oven را تعریف کنید که تعداد دقیقه‌های واقعی ماندن لازانیا در فر را به عنوان پارامتر می‌گیرد و بر اساس زمان مورد انتظار پخت در فر از کار قبلی، برمی‌گرداند که لازانیا هنوز چند دقیقه باید در فر بماند.

Lasagna.new.remaining_minutes_in_oven(30)
# => 10

3. زمان آماده‌سازی را بر حسب دقیقه محاسبه کنید

متد Lasagna#preparation_time_in_minutes را تعریف کنید که تعداد لایه‌هایی را که به لازانیا اضافه کرده‌اید به عنوان پارامتر می‌گیرد و تعداد دقیقه‌هایی را برمی‌گرداند که صرف آماده‌سازی آن کرده‌اید، با این فرض که آماده‌سازی هر لایه ۲ دقیقه طول می‌کشد.

Lasagna.new.preparation_time_in_minutes(2)
# => 4

4. مجموع زمان کار را بر حسب دقیقه محاسبه کنید

متد Lasagna#total_time_in_minutes را تعریف کنید که دو پارامتر نام‌دار می‌گیرد: پارامتر number_of_layers تعداد لایه‌هایی است که به لازانیا اضافه کرده‌اید و پارامتر actual_minutes_in_oven تعداد دقیقه‌هایی است که لازانیا در فر بوده است. این متد باید مجموع دقیقه‌هایی را که صرف پخت لازانیا کرده‌اید برگرداند؛ این مقدار برابر است با مجموع زمان آماده‌سازی و زمانی که لازانیا تا این لحظه در فر گذرانده است.

number_of_layers = 3
actual_minutes_in_oven = 20
Lasagna.new.total_time_in_minutes(number_of_layers, actual_minutes_in_oven)
# => 26
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Crystal Exercism

آماده‌اید لازانیای شگفت‌انگیز آری را شروع کنید؟

در Exercism ثبت‌نام کنید تا Crystal را همراه با 26 مفهوم142 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.