المسارات
/
Crystal
Crystal
/
التمارين
/
لازانيا Ary المذهلة
لازانيا Ary المذهلة

لازانيا Ary المذهلة

تمرين تعلّمي

مقدمة

البدء

المتغيرات

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

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

مستعد لبدء لازانيا Ary المذهلة؟

سجّل في Exercism لتتعلّم وتتقن Crystal عبر 26 مفهومًا142 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.