LoginSignup
4
1

More than 5 years have passed since last update.

シンボルとは

Last updated at Posted at 2018-12-22

この記事はギークハウス新宿界隈 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入門

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1