Help us understand the problem. What is going on with this article?

シンボルとは

More than 1 year has passed since last update.

この記事はギークハウス新宿界隈 Advent Calendar 2018 7日目の記事です。

はじめに

公式ドキュメントでは、シンボルついて以下のように説明されています。

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

なんとなく、「文字列と似たような働きができるのかな?」程度は理解できるのですが、
この説明だけでは文字列と比較して、どのような利点があるのかがわからなかったのでまとめてみました。

基本形

:symbol_name

シンボルと文字列の違い

クラスが違う

  • シンボルはSymbolクラス :apple.class #=> Symbol
  • 文字列はStringクラス 'apple'.class #=> String

処理速度がシンボルの方が速い

シンボルは表面的には文字列と同じように見えますが、整数として管理されるために文字列より高速に処理されます。

メモリの使用効率が良い

シンボルが同じであれば全く同じオブジェクトになるため、文字列よりもシンボルの方がメモリの使用効率が良くなります。
※同じオブジェクトであるかは、object_idメソッドでわかる。

#シンボル
:apple.object_id #=> 1282588
:apple.object_id #=> 1282588

#文字列
'apple'.object_id #=> 70191702696840
'apple'.object_id #=> 70191706838180

シンボルはイミュータブルなオブジェクト

シンボルは文字列と違いイミュータブルなオブジェクトであるため、文字列のように破壊的な変更はできません。
名前を指し示す時に使うことで、勝手に名前を変更されないようにすることができます。
イミュータブルがわからない方はこちらを参照

string = 'apple' #=> "apple"
string.upcase! #=> "APPLE"
string #=> "APPLE"

symbol = :apple #=> :apple
symbol.upcase! #=> NoMethodError (undefined method `upcase!' for :apple:Symbo

用途

文字列と比較した時の処理速度の速さと、メモリの使用効率の良さを活かし、
名前を識別したいが、その名前が文字列である必要がない場合に使われます。

以下、代表的な利用例。

ハッシュのキー

{:name => 'Tom', :mail => 'tom@mail.com'}

アクセサの引数で渡すインスタンス変数名

attr_render :name

参考

公式リファレンス
プロを目指す人のためのRuby入門

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした