シンボルは、値を参照するために使える名前付きの識別子です。
シンボルはシンボルリテラルで作成します。名前の先頭に:を付ける形で、たとえば: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 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]
すべてのメソッドはKernel APIとModule APIに掲載されています。