برای تعریف متغیر از عملگر انتساب = استفاده کنید.
در 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
در این تمرین، کدی مینویسید که به شما کمک میکند از کتاب آشپزی محبوبتان یک لازانیای عالی بپزید.
چهار کار پیش رو دارید که همگی به زمان صرفشده برای پخت لازانیا مربوط میشوند.
ثابت EXPECTED_MINUTES_IN_OVEN را در کلاس Lasagna تعریف کنید؛ این ثابت نگه میدارد که لازانیا چند دقیقه باید در فر بماند.
بر اساس کتاب آشپزی، زمان مورد انتظار پخت در فر ۴۰ دقیقه است:
Lasagna::EXPECTED_MINUTES_IN_OVEN
# => 40
متد Lasagna#remaining_minutes_in_oven را تعریف کنید که تعداد دقیقههای واقعی ماندن لازانیا در فر را به عنوان پارامتر میگیرد و بر اساس زمان مورد انتظار پخت در فر از کار قبلی، برمیگرداند که لازانیا هنوز چند دقیقه باید در فر بماند.
Lasagna.new.remaining_minutes_in_oven(30)
# => 10
متد Lasagna#preparation_time_in_minutes را تعریف کنید که تعداد لایههایی را که به لازانیا اضافه کردهاید به عنوان پارامتر میگیرد و تعداد دقیقههایی را برمیگرداند که صرف آمادهسازی آن کردهاید، با این فرض که آمادهسازی هر لایه ۲ دقیقه طول میکشد.
Lasagna.new.preparation_time_in_minutes(2)
# => 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