Char هو نوع بيانات في Crystal يمثل نقطة ترميز يونيكود بعرض 32 بت.
حجمها يجعلها موفّرة للذاكرة، ويمنحها خصائص معيّنة لا تملكها السلاسل النصية.
وتُنشأ باستخدام علامات التنصيص المفردة (') وتسمح بوضع نقطة ترميز يونيكود واحدة فقط بداخلها.
'a' # => 'a'
'a'.class # => Char
من الشائع جدًا التعامل مع قيم Char عند العمل مع السلاسل النصية في Crystal، لأن عددًا لا بأس به من الطرق في صنف String تُرجع قيم Char أو تأخذ قيم Char كوسائط.
فمثلًا، تُرجع الطريقة String#[] قيمة Char، كما تُرجع الطريقة String#chars مجموعة من قيم Char.
ولأن Char يمثل نقطة ترميز يونيكود بعرض 32 بت، فهو يدعم الزيادة والإنقاص، وهذا يعني أنه إذا كانت لديك القيمة 'a' يمكنك الحصول على 'b' بإضافة واحد إليها.
'a' + 5
# => 'f'
'z' - 25
# => 'a'
توجد أيضًا طريقة تُسمى Char#succ تُرجع المحرف التالي في جدول يونيكود، وChar#pred تُرجع المحرف السابق في جدول يونيكود.
'a'.succ
# => 'b'
'z'.pred
# => 'y'
ولأن Char مخصص فقط لتمثيل نقطة ترميز يونيكود بعرض 32 بت، فلا يمكن دمج محرفين معًا.
لذلك يمكن دمج Char مع السلاسل النصية فقط.
'a' + "bc"
# => "abc"
'a' + 'b'
# => error: expected argument #1 to 'Char#+' to be Int or String, not Char
يمتلك Crystal بعض الطرق للحصول على معلومات عن المحرف، مثل ما إذا كان عددًا أم حرفًا، أو ما إذا كان بحروف صغيرة أم كبيرة.
إليك قائمة ببعض هذه الطرق، وللاطلاع على القائمة الكاملة راجع واجهة API الخاصة بـ Char:
| الطريقة | الوصف |
|---|---|
Char#number? |
تُرجع true إذا كان المحرف عددًا |
Char#letter? |
تُرجع true إذا كان المحرف حرفًا |
Char#lowercase? |
تُرجع true إذا كان المحرف بحروف صغيرة |
Char#uppercase? |
تُرجع true إذا كان المحرف بحروف كبيرة |
Char#ascii? |
تُرجع true إذا كان المحرف محرف ASCII |
Char#whitespace? |
تُرجع true إذا كان المحرف مسافة بيضاء |
Char
ولأن Char يمثل نقطة ترميز يونيكود بعرض 32 بت، يمكنك التحويل بين قيم Char ونقاط الترميز (من النوع Int).
يمكن القيام بذلك باستخدام الطريقة Char#ord التي تُرجع نقطة ترميز المحرف، أو الطريقة Int#chr التي تُرجع المحرف المقابل لنقطة الترميز.
'a'.ord
# => 97
97.chr
# => 'a'
وكما هو الحال مع أنواع البيانات الأخرى، يمتلك Char بعض الطرق للتحويل بين الأنواع.
أكثرها شيوعًا هي الطريقة Char#to_s التي تحوّل المحرف إلى سلسلة نصية. غير أن هناك أيضًا الطريقة Char#to_i التي تحوّل المحرف إلى عدد صحيح، والطريقة Char#to_f التي تحوّل المحرف إلى عدد عشري.
'a'.to_s
# => "a"
'4'.to_i
# => 4
'a'.to_i
# => Error: Invalid integer: a (ArgumentError)
مكتبة لوتون مكتبة كبيرة تضم مجموعة واسعة من المؤلفات، تمتد من الكتب إلى الفنون. وللمكتبة قسم يدرس الأدب ويضيف الكتب إلى نظام الحاسوب.
تهدف بعض الأجزاء إلى أن تكون مؤتمتة، ويُطلب منك مساعدتهم في ذلك. ويشمل هذا مساعدتهم في أمور تتراوح من أتمتة نماذج عملية الإدراج إلى المساعدة في فك تشفير النصوص.
يفترض أن تكون كتب المكتبة سهلة العثور عليها، لذا تُرتَّب حسب الحرف الأول من العنوان.
نفّذ طريقة Library.first_letter، التي تأخذ وسيطًا title يحمل عنوان الكتاب.
ينبغي للطريقة أن تُرجع الحرف الأول من العنوان.
Library.first_letter("Mystery of the Crystal Skull")
# => 'M'
تضم المكتبة الكثير من الكتب التي كتبها مؤلفون مختلفون.
غالبًا ما يُشار إلى المؤلفين بأحرفهم الأولى، لذا طلبت المكتبة نظامًا يعطي الأحرف الأولى للمؤلف عند إدخال اسمه الأول واسمه الأخير.
ينبغي تنسيق الأحرف الأولى على هذا النحو: {first_letter_of_first_name}.{first_letter_of_last_name}
نفّذ طريقة Library.initials التي تأخذ وسيطين هما first_name وlast_name، ويحملان الاسم الأول والاسم الأخير للمؤلف.
ينبغي للطريقة أن تُرجع الأحرف الأولى للمؤلف.
Library.initials("William", "Shakespeare")
# => "W.S"
بعض المؤلفات مشفّرة، ولدى المكتبة الكثير من النصوص المشفّرة. وترغب المكتبة في نظام فك تشفير جديد لتشفير خاص.
يعمل التشفير بأخذ الحرف واستبداله بالحرف الذي يسبقه في الأبجدية.
على سبيل المثال، يصبح a هو z، ويصبح b هو a، ويصبح c هو b، وهكذا.
وترغب المكتبة في أن يكون قادرًا على فك تشفير الأحرف الكبيرة والصغيرة مع الحفاظ على حالة الحرف الأصلي.
نفّذ طريقة Library.decrypt_character، التي تأخذ وسيطًا character يحمل الحرف المراد فك تشفيره.
ينبغي للطريقة أن تُرجع الحرف المفكوك التشفير.
Library.decrypt_character('a')
# => 'z'
وترغب المكتبة أيضًا في فك تشفير نص كامل، بالتشفير الذي يأخذ الحرف السابق في الأبجدية.
ينبغي لأداة فك التشفير أن تفك تشفير الأحرف فقط وتترك جميع الأحرف الأخرى كما هي.
نفّذ طريقة Library.decrypt_text، التي تأخذ وسيطًا text يحمل النص المراد فك تشفيره.
ينبغي للطريقة أن تُرجع النص المفكوك التشفير.
Library.decrypt_text("Ifmmp Xpsme!")
# => "Hello World!"
سجّل في Exercism لتتعلّم وتتقن Crystal عبر 26 مفهومًا142 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.