はじめに
プログラミング初学者です!
現在Rubyを学習中なのですが、シンボルと文字列の違いについて少し悩んだので本記事を通して整理していければなと思います。
シンボルについて
現在ハッシュのキーには文字列を使っていますが、シンボルを使うことが推奨されているみたいです。
Rubyにおけるシンボルって一体なんなんでしょうか?
公式リファレンスによると、
シンボルを表すクラス。
シンボルは任意の文字列と一対一に対応するオブジェクトです。
文字列の代わりに用いることもできますが、必ずしも文字列と同じ振る舞いをするわけではありません。同じ内容のシンボルはかならず同一のオブジェクトです。
う〜ん。。。
なんだかわかったような、わからないような・・・
コードで見ると以下のような感じです。
:シンボルの名前
# シンボルの例
irb(main):001:0> :name
# シンボルクラスのオブジェクト
irb(main):002:0> :name.class
=> Symbol
まあ要するに、シンボルは、コロン(:)を使って任意の名前を定義します(シンボルリテラル)。
シンボルは、Symbolクラスのオブジェクトのことです。
文字列について
次に文字列についてです。
文字列といったらシングルクオート(')、ダブルクオート(")で囲って完成!みたいなイメージですけどどうなんでしょうか・・・?
公式リファレンスによると
文字列のクラスです。ヌル文字を含む任意のバイト列を扱うことができます。文字列の長さにはメモリ容量以外の制限はありません。
文字列は通常、文字列リテラルを使って生成します。
となっていますが、これも見た方が早いですね。
'これは文字列です'
"これは文字列です"
# 文字列の例
irb(main):001:0> name = "アグエロ"
=> "アグエロ"
# シンボルクラスのオブジェクト
irb(main):002:0> name.class
=> String
上記から、文字列オブジェクトはダブルクオート(シングルクオートでも可)で囲うと定義できるということがわかりました。
シンボルと文字列の違いは?
結局何が違うのか?ということなんですが、主に3つ違いがあります。
- 1つ目はシンボルは同値ならば必ず同一という特徴になります。
以下のコードを見てください。
# シンボルの例
irb(main):003:0> :apple.object_id
=> 1516828
irb(main):004:0> :apple.object_id
=> 1516828
# 文字列の例
irb(main):005:0> 'apple'.object_id
=> 2664429360
irb(main):006:0> 'apple'.object_id
=> 2664423780
シンボルにおいて同値の場合は同じobject_idが割り当てられ、同じオブジェクトを指します。
文字列は2つとも異なるobject_idが割り当てられます。
- 2つ目はシンボルは書き換えられないという特徴になります。
以下のコードを見てください。
#文字列の例
irb(main):007:0> string = 'apple'
=> "apple"
irb(main):008:0> string.upcase!
=> "APPLE"
irb(main):009:0> string
=> "APPLE"
#シンボルの例
irb(main):010:0> symbol = :apple
=> :apple
irb(main):011:0> symbol.upcase! NoMethodError (undefined method `upcase!' for :apple:Symbol)
文字列は変更可能なオブジェクトですが、シンボルは変更することができません。
- 3つ目は比較の処理はシンボルの方が高速という特徴になります。
比較を行う際に、文字列を使う場合はその度に新しく文字列を生成する必要があり若干の面倒臭さがありますが、シンボルはその必要がないため効率がよく高速に比較することができます。
まとめ
以上のことから、シンボルは文字列のように破壊的な変更ができないため、「名前などの勝手に変更されては困るデータ」を取り扱う際に向いているということがわかりました。
最後に
改めて見直すと今回の記事でもいろんな発見があった気がします。
引き続きRubyの学習を継続させていきRubyマスターに俺はなる!!っていう意気込みで頑張って参りますので応援よろしくお願いいたします。笑
最後まで本記事を読んでくださりありがとうございました🙇
参考文献