«سمبلها» شناسههایی هستند که اسم دارند و میتوان از آنها برای اشاره به یک مقدار استفاده کرد.
سمبلها با نوشتن یک سمبل در کد ساخته میشوند: کافی است پیش از یک اسم، کاراکتر : بگذارید، مثل :foo.
همچنین میتوان سمبلها را داخل گیومه نوشت، مثل :"foo"، که برای نمونه امکان داشتن فاصله در اسم را فراهم میکند.
:foo # => :foo
:"foo boo" # => :"foo boo"
سمبلها در بخشهای زیادی از زبان به کار میروند؛ از جمله به عنوان کلید در هشها و برای نمایش اسم متدها و متغیرها.
تفاوت سمبلها با رشتهها در این است که سمبلها شناسهاند و نمایندهی داده یا متن نیستند. یعنی دو سمبل با اسم یکسان همیشه یک شیء واحد هستند.
"foo".object_id # => 60
"foo".object_id # => 80
:foo.object_id # => 1086748
:foo.object_id # => 1086748
سمبلها تغییرناپذیرند، یعنی نمیتوان آنها را تغییر داد. پس وقتی یک سمبل را «تغییر» میدهید، در واقع یک سمبل تازه میسازید. چند متد وجود دارد که میتوان با آنها سمبلها را دستکاری کرد؛ همهی آنها سمبلهای تازه برمیگردانند. همهی این متدها را میتوانید در API مربوط به سمبل پیدا کنید.
: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]
همهی این متدها را میتوانید در API مربوط به Kernel و API مربوط به Module پیدا کنید.