مثل كل شيء في Ruby، فإن String كائن.
تتكوّن السلاسل النصية من تسلسل عشوائي من البايتات (عادةً أحرف)، وتُهيَّأ وتُعالَج مثل أي كائن آخر.
في الواقع، من أكثر ما يميّز Ruby هو كثرة الطرق التي يمكن استدعاؤها على السلاسل النصية (وعلى كائنات أخرى)، مما يوفّر عليك الكثير من الوقت في كتابة الكود.
في هذا التمرين سنستكشف بعض هذه الطرق المساعدة وسنجرّبها.
رغم أنك تستطيع استخدام String.new(...) لإنشاء سلسلة نصية، فالأكثر شيوعًا هو استخدام قيمة حرفية.
هناك الكثير من القيم الحرفية المختلفة التي يمكنك استخدامها، وهي تنقسم إلى فئتين: تلك التي تسمح بالإدراج وتلك التي لا تسمح به.
أكثر القيم الحرفية شيوعًا هي علامات التنصيص المفردة والمزدوجة ('...' و"...").
لا تسمح علامات التنصيص المفردة بالإدراج، بينما تسمح المزدوجة به.
الإدراج هو أن تُضمَّن سلسلة نصية داخل أخرى باستخدام الصيغة #{}.
# Use single quotes when not interpolated
location = 'World'
# And double quotes when interpolated
puts "Hello, #{location}!" #=> "Hello, World!"
يمكنك أيضًا استخدام قيم حرفية أخرى مثل %{... } للسلاسل النصية بإدراج و%q{...} للسلاسل النصية بدون إدراج.
هذه مفيدة إذا كانت سلاسلك النصية تحتوي على المحرفين ' أو ".
ملاحظة: لا توجد قاعدة مطلقة تقول إنه يجب عليك استخدام سلاسل نصية بدون إدراج إذا كانت سلسلتك لا تحتوي على إدراج.
من المفيد أن تفكّر في السلاسل النصية في Ruby بطريقة مشابهة لتفكيرك في المصفوفات.
فلها حجم، وأحرفها مفهرسة (بحيث يكون 0 هو الفهرس الأول):
my_string = "Some string"
my_string.size #=> 11
my_string[0] #=> 'S'
my_string[1] #=> 'o'
my_string[-1] #=> 'g'
# Find the first index of a character
my_string.index('m') #=> 2
يمكن استخراج أجزاء من السلاسل النصية باستخدام الفهارس أو slice:
my_string = "Some string"
# Find three characters starting with the second character (index 1)
my_string[1, 3] #=> "ome"
my_string.slice(1, 3) #=> "ome"
يمكن أيضًا التعامل مع القيم الدلالية للسلاسل النصية. يستحق الأمر أن تستكشف وثائق Ruby لتتعرّف على كل الطرق، لكن إليك بعض الأمثلة الشائعة الاستخدام:
"hello".capitalize #=> "Hello"
"HELLO".downcase #=> "hello"
"hello".center(9) #=> " hello "
" hello ".strip #=> "hello"
"hello world".split(" ") #=> ["hello", "world"]
يمكنك أيضًا استخدام طرق مثل gsub لاستبدال الأحرف:
# Replace one character with another
"noob".gsub("o","0") #=> "n00b"
# (Advanced) Replace a regular expression
"Ruby really rocks".gsub(/[aieou]/,'') #=> "Rby rlly rcks"
في كل الأمثلة أعلاه، تُرجع سلسلة نصية جديدة.
لكن للعديد من الطرق نظائر تنتهي بـ! وتعدّل السلسلة النصية نفسها فعليًا.
# Use normal methods to return new strings
my_string = "hello"
my_string.capitalize #=> "Hello"
puts my_string #=> "hello"
# And bang-methods (...!) to modify the object
my_string = "hello"
my_string.capitalize! #=> "Hello"
puts my_string #=> "Hello"
في هذا التمرين ستتعامل مع أسطر السجل.
كل سطر سجل هو سلسلة نصية مُنسّقة على النحو التالي: "[<LEVEL>]: <MESSAGE>".
هناك ثلاثة مستويات مختلفة للسجل:
INFOWARNINGERRORلديك ثلاث مهام، تأخذ كل منها سطر سجل وتطلب منك أن تفعل به شيئًا. توجد أساليب كثيرة لحل هذه المهام؛ اختر أساليبك المفضلة من الأمثلة أعلاه وانظر ما يمكنك التوصل إليه.
نفّذ الطريقة LogLineParser#message لتُرجع رسالة سطر السجل:
LogLineParser.new('[ERROR]: Invalid operation').message
# => "Invalid operation"
يجب إزالة أي مسافات بادئة أو لاحقة:
LogLineParser.new("[WARNING]: Disk almost full\r\n").message
# => "Disk almost full"
نفّذ الطريقة LogLineParser#log_level لتُرجع مستوى السجل الخاص بسطر السجل، ويجب أن يكون بحروف صغيرة:
LogLineParser.new('[ERROR]: Invalid operation').log_level
# => "error"
نفّذ الطريقة LogLineParser#reformat التي تُعيد تنسيق سطر السجل، فتضع الرسالة أولًا ثم مستوى السجل بعدها بين الأقواس الهلالية:
LogLineParser.new('[INFO]: Operation completed').reformat
# => "Operation completed (info)"
سجّل في Exercism لتتعلّم وتتقن Ruby عبر 21 مفهومًا121 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.