لتعريف متغير، استخدم عامل الإسناد =.
في 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، الذي يخزّن عدد الدقائق التي ينبغي أن تبقى فيها اللازانيا في الفرن.
وفقًا لكتاب الطبخ، وقت الفرن المتوقع بالدقائق هو 40:
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
سجّل في Exercism لتتعلّم وتتقن Crystal عبر 26 مفهومًا142 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.