class Symbol
クラスの継承リスト: Symbol < Object < Kernel
要約
シンボルを表すクラス。シンボルは任意の文字列と一対一に対応するオブジェクトです。
文字列の代わりに用いることもできますが、必ずしも文字列と同じ振る舞いをするわけではありません。 同じ内容のシンボルはかならず同一のオブジェクトです。
シンボルオブジェクトは以下のようなリテラルで得られます。
: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 ←同値ならば同一
用途
実用面では、シンボルは文字の意味を明確にします。`名前'を指し示す時など、 文字列そのものが必要なわけではない時に用います。
- ハッシュのキー { :key => "value" }
- アクセサの引数で渡すインスタンス変数名 attr_reader :name
- メソッド引数で渡すメソッド名 __send__ :to_s
- C の enum 的な使用 (値そのものは無視してよい場合)
シンボルを使うメリットは
- 新しく文字列を生成しない分やや効率がよく、比較も高速。
- 文字の意味がはっきりするのでコードが読みやすくなる
- immutable なので内容を書き換えられる心配がない
大抵のメソッドはシンボルの代わりに文字列を引数として渡すこともできるようになっています。
特異メソッド
all_symbols -> [Symbol]
-
定義済みの全てのシンボルオブジェクトの配列を返します。
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
to_s -> String
-
シンボルに対応する文字列を返します。
逆に、文字列に対応するシンボルを得るには String#intern を使います。
p :foo.id2name # => "foo" p :foo.id2name.intern == :foo # => true
[SEE_ALSO] String#intern
inspect -> String
-
自身を人間に読みやすい文字列にして返します。
:fred.inspect #=> ":fred"
to_i -> Integer
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
-
self に対応する Proc オブジェクトを返します。
生成される Proc オブジェクトを呼びだす(Proc#call)と、 その第一引数の self という名前のメソッドを 残りの引数を渡して呼びだされます。
:to_i.to_proc["ff", 16] # => 255 (1..3).collect(&:to_s) #=> ["1", "2", "3"] (1..3).inject(&:+) #=> 6
to_sym -> self
-
self を返します。
[SEE_ALSO] String#intern