ハッシュに使われている「:(コロン)」シンボルとは?
シンボルとは
- 見た目は文字
- 中身は整数
のオブジェクトです!
と言っても「どゆこと??」ですよね…詳しく解説していきます!
実際に「文字で作るハッシュ」と「シンボルで作るハッシュ」を見てみましょう!
ハッシュ?という方は、この記事を先に見てみてください
#文字でハッシュを作る
{"name"=>"田中", "age"=>25, "gender"=>"男"}
#シンボルでハッシュを作る
{name: "田中", age: 25, gender: "男"}
"name"使ったハッシュ、name:(シンボル)を使ったハッシュを作りました!
"name" と name:を比べて見るとどうでしょうか?
どちらも人間から見ると文字に見えますよね?
この様に、シンボルは表面的には文字列と同じ様に見えます!
そして、内部では整数として扱われます。
rubyのリファレンス(シンボル)を見ると
「シンボルは、ソース上では文字列のように見え、内部では整数として扱われる、両者を仲立ちするような存在です」
と書かれています!
つまり
- 内部は数字なので、PCは処理しやすい
- 表面上は文字なので、人間は理解しやすい
人間にもPCにも優しい、それがシンボルです!
なぜシンボルが使われるのか?
シンボルを使うメリットは
- 表面上は文字列のように見えるので、人間が扱いやすい
- 内部は整数なので、PCにとって優しく高速で処理できる
- シンボルは同じオブジェクトになるため、メモリ消費が少ない
この様なメリットがあります
上2つは上記で話した通りですが、「シンボルは同じオブジェクトになるため、メモリ消費が少ない」
とはどういう事なのでしょうか?
シンボルは同じオブジェクトになるため、メモリ消費が少ない
シンボルは1度作ると、メモリ上で同じところを使い続けます!
どういう事か?
:nameというシンボルを3つ作って見ましょう!
#シンボル
puts :name.object_id
puts :name.object_id
puts :name.object_id
結果
88028
88028
88028
この様に3つの:nameを作り、object_idを調べてみます
すると88028というid番号が3つ同じなのが確認できると思います!
3つとも同じid番号という事は、全く同じオブジェクトという事です
同じオブジェクトになるため、メモリ上で同じところを使い続ける事ができます。
では"name"という文字列を3つ作って見てみましょう!
#文字列
puts "name".object_id
puts "name".object_id
puts "name".object_id
結果
14830080
14829940
14829880
14830080、14829940、14829880すべて違う番号ですよね
違う番号ということは、メモリでは違う領域が使われているという事になります
- シンボルは1度作ると、メモリ上で同じところを使い続ける
- 文字列はそれぞれメモリ領域を確保する
この事から、「シンボルはメモリ消費が少ない」となります
まとめ
シンボルとは「見た目は文字」「内部は数値」のオブジェクト
シンボルを使うメリットとして
- 表面上は文字列のように見えるので、人間が扱いやすい
- 内部は整数なので、PCにとって優しく高速で処理できる
- シンボルは同じオブジェクトになるため、メモリ消費が少ない