Ruby 2.3.0 リファレンスマニュアル > ライブラリ一覧 > 組み込みライブラリ > Symbolクラス

class Symbol

クラスの継承リスト: Symbol < Comparable < Object < Kernel < BasicObject

要約

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

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

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

: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 ←同値ならば同一

用途

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

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

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

Symbol クラスのメソッドには、String クラスのメソッドと同名で似た働きをするものもあります。

GC

内部的にシンボルは

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

2.2.0 以降においては、テーブルに記録された情報は Ruby によって GC されます。すなわち、ある使わなくなった シンボルのテーブル上の情報はGCによって削除されます。

2.1 以前ではこの機能がなかったため、ユーザからの入力を シンボルに変換するようなプログラムは DoS に対して弱い 可能性がありましたが、 そのような問題は2.2以降では解決されました。

ただし拡張ライブラリ内で rb_intern によって生成された シンボルに関するテーブル上の情報はGCされませんので注意してください。

特異メソッド

定義 説明
all_symbols -> [Symbol]

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

インスタンスメソッド

定義 説明
self <=> other -> -1 | 0 | 1

self と other のシンボルに対応する文字列を ASCII コード順で比較して、 self が大きい時には正の整数、等しい時には 0、小さい時には負の整数を返し ます。

self == other -> true | false

other が同じシンボルの時に真を返します。 そうでない場合は偽を返します。

self =~ other -> Integer | nil

正規表現 other とのマッチを行います。

self[nth] -> String | nil
slice(nth) -> String | nil

nth 番目の文字を返します。

self[nth, len] -> String | nil
slice(nth, len) -> String | nil

nth 番目から長さ len の部分文字列を新しく作って返します。

self[substr] -> String | nil
slice(substr) -> String | nil

self が substr を含む場合、一致した文字列を新しく作って返します。

self[regexp, nth = 0] -> String | nil
slice(regexp, nth = 0) -> String | nil

正規表現 regexp の nth 番目の括弧にマッチする最初の部分文字列を返します。

self[range] -> String | nil
slice(range) -> String | nil

rangeで指定したインデックスの範囲に含まれる部分文字列を返します。

capitalize -> Symbol

シンボルに対応する文字列の先頭の文字を大文字に、残りを小文字に変更した シンボルを返します。

casecmp(other) -> -1 | 0 | 1

Symbol#<=> と同様にシンボルに対応する文字列の順序を比較しますが、 アルファベットの大文字小文字の違いを無視します。

downcase -> Symbol

大文字を小文字に変換したシンボルを返します。

empty? -> bool

自身が :"" (length が 0 のシンボル)かどうかを返します。

encoding -> Encoding

シンボルに対応する文字列のエンコーディング情報を表現した Encoding オブ ジェクトを返します。

id2name -> String
to_s -> String

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

inspect -> String

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

intern -> self
to_sym -> self

self を返します。

length -> Integer
size -> Integer

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

match(other) -> MatchData | nil

正規表現 other とのマッチを行います。

succ -> Symbol
next -> Symbol

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

swapcase -> Symbol

'A' から 'Z' までのアルファベット大文字を小文字に、'a' から 'z' までの アルファベット小文字を大文字に変更したシンボルを返します。

to_proc -> Proc

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

upcase -> Symbol

小文字を大文字に変換したシンボルを返します。

継承したメソッド

! != __id__ instance_eval instance_exec singleton_method_added singleton_method_removed singleton_method_undefined < <= > >= between? !~ === __send__ _dump class clone define_singleton_method display enum_for eql? equal? extend freeze frozen? hash initialize initialize_copy instance_of? instance_variable_defined? instance_variable_get instance_variable_set instance_variables is_a? itself marshal_dump marshal_load method method_missing methods nil? object_id pretty_inspect pretty_print pretty_print_cycle pretty_print_inspect pretty_print_instance_variables private_methods protected_methods psych_to_yaml public_method public_methods public_send remove_instance_variable respond_to? respond_to_missing? singleton_class singleton_method singleton_methods taint tainted? tap to_a to_ary to_hash to_int to_io to_regexp to_str trust untaint untrust untrusted? .new .yaml_tag ::ARGF ::ARGV ::DATA ::ENV ::FALSE ::NIL ::RUBY_COPYRIGHT ::RUBY_DESCRIPTION ::RUBY_ENGINE ::RUBY_PATCHLEVEL ::RUBY_PLATFORM ::RUBY_RELEASE_DATE ::RUBY_REVISION ::RUBY_VERSION ::SCRIPT_LINES__ ::STDERR ::STDIN ::STDOUT ::TOPLEVEL_BINDING ::TRUE