الرموز هي مُعرّفات مُسمّاة يمكن استخدامها للإشارة إلى قيمة.
تُنشأ الرموز عبر كتابة صيغة حرفية للرمز، تتم بوضع النقطتين : قبل الاسم، مثل :foo.
ويمكن أيضًا كتابتها بين علامتي تنصيص، مثل :"foo"، وهذا يسمح مثلًا بوجود مسافات في الاسم.
:foo # => :foo
:"foo boo" # => :"foo boo"
تُستخدم الرموز في مواضع كثيرة في اللغة، بما في ذلك كمفاتيح في الهاش، ولتمثيل أسماء الطرق وأسماء المتغيرات.
ما يميّز الرموز عن السلاسل النصية أنها مُعرّفات، ولا تمثّل بيانات أو نصًا. وهذا يعني أن رمزين يحملان الاسم نفسه هما دائمًا الكائن نفسه.
"foo".object_id # => 60
"foo".object_id # => 80
:foo.object_id # => 1086748
:foo.object_id # => 1086748
الرموز غير قابلة للتعديل، أي أنه لا يمكن تغييرها. وهذا يعني أنك عندما "تعدّل" رمزًا فأنت في الحقيقة تُنشئ رمزًا جديدًا. توجد بعض الطرق التي يمكن استخدامها للتعامل مع الرموز، وكلها تُرجع رموزًا جديدة. يمكن العثور على جميع الطرق في واجهة Symbol البرمجية.
:foo.upcase # => :FOO
:foo.object_id # => 1086748
:foo.upcase.object_id # => 60
تكمن فائدة كون الرموز غير قابلة للتعديل في أنها أكثر كفاءة في استخدام الذاكرة من السلاسل النصية، كما أنها أكثر أمانًا عند استخدامها كمُعرّفات.
يمكن تحويل الرموز إلى سلاسل نصية والعكس.
قد يكون هذا مفيدًا عندما تريد تعديل رمز، أو عندما تريد استخدام رمز كسلسلة نصية.
لتحويل سلسلة نصية إلى رمز، يمكنك استخدام الطريقة String#to_sym، وللقيام بالعكس يمكنك استخدام الطريقة Symbol#to_s.
ولأن الرموز تمتلك مجموعة محدودة من الطرق، فقد يكون من المفيد تحويل رمز إلى سلسلة نصية لاستخدام طرق السلاسل النصية عليه، إذا كنت بحاجة إلى رمز جديد.
:foo.to_s # => "foo"
"foo".to_sym # => :foo
في Ruby يمكنك الحصول على الأسماء داخل النطاقات باستخدام طرق متنوعة للحصول على أسماء الثوابت والطرق والمتغيرات. تُرجع هذه الطرق مصفوفات من الرموز.
ومن هذه الطرق Module#constants وModule#instance_methods وModule#class_variables وglobal_variables وlocal_variables.
module Foo
BAR = 1
def self.baz; end
end
a = 1
Foo.constants # => [:BAR]
Foo.instance_methods # => [:baz]
local_variables # => [:a]
يمكن العثور على جميع الطرق في واجهة Kernel البرمجية وواجهة Module البرمجية.