シン

シンボル の Ruby

1個の演習

シンボルについて

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

GitHubで編集 リンクは新しいウィンドウまたはタブで開きます

シンボルを学習する