strings in ruby التعامل مع النصوص في روبي RUBY – القيم الحرفية، التكرار وإضافة أسطر جديدة


إبراهيم البحيصي

تعرفنا في الدرس السابق على كيفية دمج النصوص واستيفائها وكذلك كيفية حفظها في متغيرات، وسنتابع في هذ الدرس التعرّف على القيم الحرفية للنصوص ويفية تكرارها، بالإضافة إلى كيفية إضافة أسطر جديدة ضمن النصوص الطويلة.

القيم الحرفية للنصوص

لاحظ أن النصوص التي كتبناها في الشيفرة البرمجية أحيطت بعلامتي تنصيص، وأن النصوص التي طُبعت كانت دون علامات التنصيص. لابد من التفرقة بين الأمرين، فالقيم الحرفية للنص هي التي تُكتب في الشيفرة البرمجية، بينما القيم النصية هي التي نراها في المُخرج ولا تحتوي على علامات التنصيص.
القيمة الحرفية تكون بالشكل التالي:

"Sammy the Shark"

والقيمة النصية:

Sammy the Shark.

في أغلب الحالات لن تحتاج للقلق حول هذا الأمر إلا إذا أردت طباعة حروف خاصة مثل علامة التنصيص في النصوص التي تريدها.

تهريب علامات التنصيص في النصوص

تُستخدم علامات التنصيص للإشارة الى النصوص في الشيفرة البرمجية، وعليك أن تقوم ببعض العمل الإضافي إذا أردت تضمين علامات التنصيص في النص الذي تريده. لو حاولنا إضافة علامة التنصيص المنفردة في نص بالشكل التالي:

'This isn't what I wanted.'

ستقوم علامة التنصيص في كلمة isn't بإنهاء النص كما تلاحظه من لون النص، ونتيجة لذلك، سيقوم مُفسر الروبي بقراءة بقية النص كشيفرة برمجية وينتج عن ذلك خطأ. وستقع في نفس المشكلة إذا قمت باستخدام علامة التنصيص المزدوجة.
يوجد لدينا بعض الخيارات للتغلب على هذه المشكلة. الخيار الأول هو أنك تستطيع أن تستخدم علامة التنصيص المعاكسة للتي تم استخدامها في تعريف النص، فلو اردت تضمين علامة التنصيص المزدوجة في نصك عليك استخدم علامة التنصيص المنفردة في تعريف النص والعكس صحيح. الخيار الثاني هو تهريب علامة التنصيص (Escaping Quotes)، أو استخدام طريقة بناء مختلفة عن لغة الروبي في بناء النصوص. سنتكلم عن كل طريقة فيما يلي.

الخيار الأول: استخدام علامة التنصيص البديلة

الخيار الأسهل لتخطي هذه المشاكل هو إحاطة النص بعلامتي تنصيص منفردتين عندما تريد إضافة علامة تنصيص مزدوجة في نصك، وإحاطة النص بعلامتي تنصيص مزدوجتين عندما تريد إضافة علامة تنصيص منفردة.
فبدلًا من استخدام علامتي تنصيص منفردتين في احاطة النص التالي:

'This isn't what I wanted.'

نستخدم علامتي تنصيص مزدوجتين كما يلي:

"This isn't what I wanted."

وبدلًا من استخدام علامتي تنصيص مزدوجتين في إحاطة النص التالي:

"Sammy says, "Hello!""

نستخدم علامتي تنصيص منفردتين كما يلي:

'Sammy says, "Hello!"'

استخدام علامة التنصيص البديلة يحل لنا أغلب الحالات وليس جميعها. فمثلا كلتا علامات التنصيص لن تنفع في طباعة النص التالي:

"Sammy says, "I'm a happy shark!""

في النص السابق، علامة التنصيص المزدوجة قبل I’m هي التي تسبب المشكلة، حيث أنها تُنهي النص الأول قبلها، ومن ثم تقوم الروبي باستقبال نص جديد بعد علامة التنصيص المنفردة في I’m والتي لا يوجد لها علامة تنصيص منفردة أخرى لإغلاقها مما يسبب ظهور خطأ. استخدام علامة التنصيص المنفردة في احاطة النص يسبب نفس المشكلة:

'Sammy says, "I'm a happy shark!"'

ولكن هذه المرة فإن علامة التنصيص المنفردة هي التي تُغلق النص. استخدام علامة التنصيص البديلة يجعل الشيفرة البرمجية لديك غير مستقرة ومُحيرة في فهم النص في بعض الحالات. الخيار الثاني لحل المشكلة هو استخدام طريقة تهريب الحروف.

الخيار الثاني: تهريب الحروف في النصوص

الخط المائل العكسي () الذي يُعرف عادةً برمز الهروب في النصوص، هذا الخط المائل يمنع مُفسر الروبي من تفسير الحرف الذي يليه في النصوص حرفيًا. سنحل مشكلة النص التالي الذي كنا نُحاول طباعته والمُحاط بعلامتي تنصيص مزدوجتين وبداخله علامة تنصيص من نفس النوع وعلامة تنصيص منفردة:

"Sammy says, "I'm a happy shark!""

لننشئ ملف باسم quoting.rb ونُضيف إليه الشيفرة التالية:

quoting.rb
print "Sammy says, "I'm a happy shark!""

عند تشغيل البرنامج سنحصل على الخطأ التالي:

Output
quoting.rb:1: syntax error, unexpected tCONSTANT, expecting end-of-input
print "Sammy says, "I'm a happy shark!""

لحل هذه المشكلة نستخدم الخط المائل العكسي. نقوم بتعديل الملف ليصبح كالتالي:

quoting.rb
print "Sammy says, \"I'm a happy shark!\""

وعند تشغيل البرنامج سنحصل على النتيجة التالية:

Sammy says, "I'm a happy shark!"

لاحظ أننا لسنا بحاجة لتهريب علامة التنصيص المنفردة في وسط النص لأنها لا تسبب تعارضًا مع علامة التنصيص التي تُحيط النص. نحتاج فقط لتهريب علامة التنصيص التي تُسبب عدم مقدرة الروبي على تفسير النص. نستطيع استخدام طريقة أخرى لحل المشكلة دون تهريب علامات التنصيص عبر استخدام الخيار الثالث التالي.

الخيار الثالث: استخدام طريقة مختلفة في بناء النصوص

حتى الان استخدمنا علامات التنصيص لتعريف النصوص. تستطيع من خلال الروبي تعريف النصوص باستخدام علامات تختلف عن علامات التنصيص، بحيث يتم تعريف مُحدد (Delimiter) أو حرف لإحاطة النصوص عند تعريفها، ويتم ذلك بعد علامة النسبة المئوية كالتالي:

%$Sammy says, "I'm a happy shark!"$

لاحظ أننا استخدمنا علامة الدولار بعد علامة النسبة المئوية، وهذا يعني أن المُحدد هنا هو علامة الدولار، والنص الذي نريده يقع بين علامتي الدولار. يُكتب النص السابق باستخدام علامتي التنصيص المزدوجة كالتالي:

"Sammy says, \"I'm a happy shark!\""

إذا أردنا استخدام نفس علامة المُحدد في النص، فعلينا في هذه الحالة تهريبه باستخدام الخط المائل العكسي. لتجنب ذلك، تستطيع استخدام الأقواس المُزهرة { } أو المُربعة [ ] كمحدد. الأقواس المُزهرة مُتعارف عليها أكثر:

%{Sammy says, "I'm a happy shark!"}

وجميعها يدعم استيفاء النصوص في حالة احتياجك لهذه الخاصية:

droplets = 5
print %{Sammy says, "I just created #{droplets} droplets!"}

سترى في العديد من برامج الروبي كل من %Q{ } و %q{ } لتعريف النصوص. العلامة%Q{ } تعمل تمامًا مثل علامة التنصيص المزدوجة، مما يعني أنك لست بحاجة لتهريب علامة التنصيص المزدوجة مع النصوص وستستطيع استخدام خاصية استيفاء النصوص أيضًا:

droplets = 5
print %Q{Sammy says, "I just created #{droplets} droplets!"}

العلامة %q{} تعمل تمامًا مثل علامة التنصيص المنفردة مع النصوص:

%q{Sammy says, "I'm a happy shark!"}

قد ترى %q و %Q مع أقواس مُربعة بدلا من أقواس مُزهرة.
كما تلاحظ، يوجد العديد من الطرق لبناء النصوص في الروبي. إذا قمت باختيار إحدى الطرق في الشيفرة البرمجية فكن ثابتًا ومستقرًا عليها. ستجد أن %Q{ } و %{ } هما الأكثر استخداما.
الان بعد أن تعلمنا كيفية التعامل مع الحروف والرموز الخاصة، سنتكلم عن النصوص الطويلة والأسطر الجديدة.

النصوص الطويلة والأسطر الجديدة

قد تحتاج في بعض الأحيان لإضافة سطر جديد. تستطيع استخدام \n أو \r لإضافة سطر جديد في النص الذي تريده:

output = "This is\na string\nwith newlines"
puts output

ستكون نتيجة الشيفرة السابقة كالتالي:

Output
This is
a string
with newlines

من ناحية عملية، الشيفرة السابقة ستجعلنا نطبع أسطر متعددة في المُخرج. على الرغم من ذلك، اذا كان السطر الذي نريد طباعته طويل نوعًا ما في الشيفرة البرمجية، سيكون من الصعب التعامل معه. يوجد بعض الحلول لذلك.
الأول، تستطيع استخدام علامة الدمج لجعل النص في عدة أسطر في الشيفرة البرمجية:

output = "This is a\n" +
         "longer string\n" +
         "with newlines."
puts output

يقوم هذا الأمر بدمج النصوص الثلاثة وطباعتها بنفس الشكل الذي تم سابقا.
تستطيع أيضًا اضافة توقيفات الأسطر (Lines Breaks) بشكل مباشر في النص:

output = "This is a
         longer string
         with newlines"
puts output

أو من خلال الطريقة التالية:

output = %{This is a
           longer string
           with newlines}
puts output

في المثالين السابقين لم نحتاج لوضع رمز السطر الجديد (\n). وهذا يعني أن النص يتم طباعته كما يُكتب، وبذلك اذا احتوى النص على مسافات فارغة أو إزاحات فسيتم طباعتها كما هي، وسيكون ناتج المثال السابق كما يلي:

Output
This is a
           longer string
           with newlines

لمنع ذلك وببساطة نقوم بإزالة الإزاحات من بداية كل سطر:

output = %{This is a
longer string
with newlines
}

نستطيع أيضًا تعريف نصوص بأسطر متعددة باستخدام heredoc او here document وهو مصطلح يُستخدم لتعريف نص في البرامج، ويتم كتابته كالتالي:

output = <<-END
This is a
longer string
with newlines
END

<<-END و END تعني بداية ونهاية النص. Heredocs في الروبي تحتفظ بالمسافات الفارغة مما يعني أنه في حالة وجود إزاحات في النص المُعرف سيتم طباعته كما هو. أنظر للشيفرة التالية:

output = <<-END
  This is a
  longer string
  with newlines
END

نسخة الروبي 2.3 وأعلى تقدم ما يسمى بـ “squiggly heredoc” والتي تٌزيل الإزاحات بشكل تلقائي من النص، ويتم ذلك باستبدال <<- بالعلامة <<~ :

output = <<~END
  This is a
  longer string
  with newlines
  and the code is indented
  but the output is not.
END

والذي يعطينا النتيجة التالية:

Output
This is a
longer string
with newlines
and the code is indented
but the output is not.

وهذا يُتيح لك أن تكون شيفرتك البرمجية مرتبة ومُزاحة بشكل جميل. خاصية Heredocs تدعم استيفاء النصوص.
كما ترى، يوجد العديد من الطرق لمعالجة الأسطر الجديدة والنصوص المتعددة في الروبي، وسوف تقابل هذه الطرق كلما تعاملت مع مشاريع روبي أكثر حيث ستجد لكل مشروع طريقته الخاصة في الكتابة. في شيفرتك البرمجية، أختر الطريقة المناسبة لك وكن ثابتًا عليها.

تكرار النصوص

في بعض الأحيان قد تحتاج إلى تكرار نص معين أكثر من مرة في الروبي. تستطيع فعل ذلك باستخدام عملية التكرار التي يرمز لها بعلامة . كما في عملية الدمج +، فإن عملية التكرار لها استخدام اخر مع الأرقام حيث تقوم بتنفيذ عملية الضرب. عند استخدام العملية * مع رقم ونص فهذا يعني عملية تكرار للنص بعدد الرقم المستخدم.
الشيفرة التالية تُستخدم لطباعة كلمة Sammy تسع مرات:

print "Sammy" * 9

وسيكون الناتج بالشكل التالي:

Output
SammySammySammySammySammySammySammySammySammy

هذا الأمر يتيح لك تنفيذ بعض الحركات الفنية باستخدام النصوص. لننشئ ملف باسم banner.rb ونضيف إليه الشيفرة التالية:

puts "=" * 15
puts "| Hello World |"
puts "=" * 15

هل تتخيل ماذا سيكون الناتج قبل تنفيذ الشيفرة؟
سيكون الناتج بالشكل التالي:

Output
===============
| Hello World |
===============

هذا مثال صغير لكيفية استخدام الحاسوب لتكرار تنفيذ مهام معينة.

خاتمة

تعلمنا في هذين الدرسين كيفية التعامل مع النصوص في لغة البرمجة روبي. قمنا بإنشاء نصوص جديدة، دمجنا النصوص مع بعضها البعض، تعلمنا عدة طرق للتعامل مع الأسطر، التنصيص والفاصلة العلوية. بالإضافة لذلك، تعلمنا خاصية استيفاء النصوص التي تمكننا من استخدام النصوص والمتغيرات مع بعضها البعض وفي النهاية تعلمنا كيفية تكرار النصوص.





تفاعل الأعضاء


لا توجد أيّة تعليقات بعد



يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن