このマニュアルは既にメンテナンスが終了したバージョンの Ruby を対象としています。 最新版のマニュアルへ

Ruby 1.8.7 リファレンスマニュアル

class Symbol

要約

シンボルを表すクラス。シンボルは任意の文字列と一対一に対応するオブジェクトです。

文字列の代わりに用いることもできますが、必ずしも文字列と同じ振る舞いをするわけではありません。同じ内容のシンボルはかならず同一のオブジェクトです。

シンボルオブジェクトは以下のようなリテラルで得られます。

:symbol
:'symbol'
%s!symbol! # %記法

生成されたシンボルの一覧は Symbol.all_symbols で得られます。一番目のリテラルでシンボルを表す場合、`:' の後には識別子、メソッド名(`!',`?',`=' などの接尾辞を含む)、変数名 (`$'などの接頭辞を含む)、再定義できる演算子のいずれかに適合するものしか書くことはできません(そうでなければ文法エラーになります)。そうでない文字列をシンボルにしたい場合は残りの表記か String#intern を使用してください。

シンボルの実装と用途

実装

Rubyの内部実装では、メソッド名や変数名、定数名、クラス名などの`名前'を整数で管理しています。これは名前を直接文字列として処理するよりも速度面で有利だからです。そしてその整数をRubyのコード上で表現したものがシンボルです。

シンボルは、ソース上では文字列のように見え、内部では整数として扱われる、両者を仲立ちするような存在です。

名前を管理するという役割上、シンボルと文字列は一対一に対応します。また、文字列と違い、immutable (変更不可)であり、同値ならば必ず同一です。

p "abc" == "abc" #=> true
p "abc".equal?("abc") #=> false
p :abc == :abc #=> true
p :abc.equal?(:abc) #=> true ←同値ならば同一

用途

実用面では、シンボルは文字の意味を明確にします。`名前'を指し示す時など、文字列そのものが必要なわけではない時に用います。

シンボルを使うメリットは

大抵のメソッドはシンボルの代わりに文字列を引数として渡すこともできるようになっています。

GC

内部的にシンボルは

の2つにより実装されています。そのため同じシンボル(同じ文字列から作られたシンボル)を複製しても同じ要素へのポインタが使われるだけなのでメモリ使用量は普通の文字列と比べて少ないです。

一方、テーブルに記録された情報はプログラムが動いている間はずっと保持しつづけられます。そのため、以下のようなコード

rng = Random.new
100000.times do { rng.bytes(1000).intern }

はテーブルのサイズを増大させ、メモリを圧迫します。

例えば web アプリケーションのようなプロセスを動かしつづけるようなアプリケーションにおいて、ユーザからの入力を String#intern でシンボルに変換するような実装をすると、DoSに弱くなる可能性があります。

目次

特異メソッド
インスタンスメソッド
追加されるメソッド

特異メソッド

all_symbols -> [Symbol][permalink][rdoc]

定義済みの全てのシンボルオブジェクトの配列を返します。

p Symbol.all_symbols #=> [:RUBY_PLATFORM, :RUBY_VERSION, ...]

リテラルで表記したシンボルのうち、コンパイル時に値が決まるものはその時に生成されます。それ以外の式展開を含むリテラルや、メソッドで表記されたものは式の評価時に生成されます。 (何にも使われないシンボルは最適化により生成されないことがあります)

def number
  'make_3'
end

p Symbol.all_symbols.select{|sym|sym.to_s.include? 'make'}
#=> [:make_1, :make_2]

re  = #確実に生成されるように代入操作を行う
:make_1,
:'make_2',
:"#{number}",
'make_4'.intern

p Symbol.all_symbols.select{|sym|sym.to_s.include? 'make'}
#=> [:make_1, :make_2, :make_3, :make_4]

インスタンスメソッド

id2name -> String[permalink][rdoc]
to_s -> String

シンボルに対応する文字列を返します。

逆に、文字列に対応するシンボルを得るには String#intern を使います。

p :foo.id2name  # => "foo"
p :foo.id2name.intern == :foo  # => true

[SEE_ALSO] String#intern

inspect -> String[permalink][rdoc]

自身を人間に読みやすい文字列にして返します。

:fred.inspect   #=> ":fred"
to_i -> Integer[permalink][rdoc]
to_int -> Integer

シンボルに対応する整数を返します。

このメソッドで得られる整数は、内部実装で名前の管理に使われています。オブジェクトに対応する整数( Object#object_id で得られます)と Symbol に対応する整数は別のものです。

逆にこの整数から対応するシンボルを得るには Fixnum#to_sym が使えます

id = :foo.to_i
p id                  #=> 8881
p id.to_sym           #=> :foo

[SEE_ALSO] Fixnum#to_sym

to_proc -> Proc[permalink][rdoc]

self に対応する Proc オブジェクトを返します。

生成される Proc オブジェクトを呼びだす(Proc#call)と、 Proc#callの第一引数をレシーバとして、 self という名前のメソッドを残りの引数を渡して呼びだします。

:to_i.to_proc["ff", 16]  #=> 255 ← "ff".to_i(16)と同じです
(1..3).collect(&:to_s)  #=> ["1", "2", "3"]
(1..3).inject(&:+)      #=> 6
to_sym -> self[permalink][rdoc]

self を返します。

[SEE_ALSO] String#intern

追加されるメソッド

taguri -> String[permalink][rdoc] [added by yaml/rubytypes]

自身のタグ URI を返します。

taguri=(val)[permalink][rdoc] [added by yaml/rubytypes]

自身のタグ URI を val に設定します。

[PARAM] val:
タグ URI を文字列で指定します。
to_yaml(opts = {}) -> String[permalink][rdoc] [added by yaml/rubytypes]

自身を YAML ドキュメントに変換します。

[PARAM] opts:
YAML ドキュメント出力の際のオプションを指定します。オプションの詳細は YAML::Syck::Emitter#reset を参照してください。
print :foo.to_yaml # => --- :foo
yaml_new(klass, tag, val)[permalink][rdoc] [added by yaml/rubytypes]

ライブラリ内部で使用します。

yaml_tag_subclasses? -> true[permalink][rdoc] [added by yaml/rubytypes]

常に true を返します。

ライブラリ内部で使用します。