Make the Most of IT.

お酒と映画が好きなJava屋さんがRubyとか学んだこと感じたことをつらつらと

Ruby勉強します #ハッシュとシンボル

はじめに

みなさん、こんにちは。
よく行く喫茶店のリニューアルオープンが火曜 (Tue) かと思ったら木曜 (Thu) でコーヒーを飲み損ねました。まるです。

さて、Rubyのお勉強記事も3回目となりました。
今回はJavaでは馴染みのないハッシュとシンボルを勉強しましたのでご紹介いたします。

今回も参考にさせていただいたのは伊藤淳一さん(@jnchito)の「プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発デバッグ技法まで 」です。
本当にわかりやすく、また非常に親しみやすい文体なので内容がスッと頭の中に入ってくる良著です。

シンボル

シンボルとは?

シンボルとは高速に処理できる"文字列っぽい"ものです。
"文字列っぽい"とはどういうことでしょうか。まずシンボルと文字列の定義方法について見てみましょう。

#シンボル
:Ruby
#文字列
'Ruby'

文字列はシングルクォート (') で囲うのに対し、シンボルは先頭にコロン (:) をつけて宣言します。宣言の方法が異なるだけでコード上は同じ"Ruby"なので文字列のように解釈することができますね。
また、シンボルはRuby内部で整数として処理されるため、文字列と比較して高速に処理することができます。

次に、シンボルと文字列のオブジェクトIDを比較してみます。

#ハッシュの場合
 :ruby.object_id=> 652188
 :ruby.object_id=> 652188
 :ruby.object_id=> 652188
#文字列の場合
'ruby'.object_id=> 70109716648080
'ruby'.object_id=> 70109712391480
'ruby'.object_id=> 70109712386020

比較結果を見ていただくとわかる通り、シンボルの場合は同じシンボルの場合は全く同じオブジェクトとなります。このため、宣言のたびに新たにメモリが確保される文字列と異なり、シンボルはメモリの使用効率が良くなります。

また、シンボルはイミュータブルなので破壊的なメソッドを実行するとエラーとなります。

以上より、シンボルは文字列と同じようにプログラマにとって理解しやすいものながらも、処ハッシュは文字列より処理速度やメモリ管理で優れたオブジェクトであることがわかりました。

ハッシュ

ハッシュとは?

ハッシュとは、キーと値を組み合わせてデータを管理するオブジェクトです。
Javaで言うところのMapに近いものでしょうか。 まずはハッシュの宣言方法から見てみましょう。

#ハッシュを定義するには{}を使います
{Key1 => Value1, Key2 => Value2}

#ハッシュは改行して書くこともできます。
#改行した方が見やすいですね。
{
  Key1 => Value1,
  Key2 => Value2,
}

データを取得する場合は、ハッシュが格納された変数名の後に[キー]で取り出せます。存在しないキーを指定した場合はnilが返ります。 また、データを追加・変更するときには特別なメソッドを呼ぶ必要はありません。JavaのMapにデータを追加する場合はadd()などを呼ぶ必要がありましたがハッシュではその必要はありません。

sampleHash = {Key1 => Value1, Key2 => Value2}

#データを取り出すとき
sampleValue = sampleHash['Key1']

#新たにデータを追加する場合
sampleHash['Key3'] = 'Value3'

#既にあるデータを変更する場合
sampleHash['Key1'] = 'VALUE1'

ハッシュとシンボル

文字列の代わりにハッシュを

ここまで例として書いてきたハッシュのキーを見てください。すべてシングルクォートで囲まれた文字列になっています。
冒頭でまとめたシンボルについて思い出してください。「ハッシュは文字列より処理速度やメモリ管理で優れたオブジェクト」です!
ハッシュのキーには文字列の代わりにシンボルを使用することができます。 キーにハッシュを指定して宣言する場合は下記のようになります。

#シンボルを使用したハッシュの宣言
sampleHash = {Key1: 'Value1', Key2: 'Value2',}

#値にもシンボルを使用することができる
#コロンが向き合うのでなんか変な感じ
sampleHash = {Key1: :Value1, Key2: :Value2}

さいごに

と言うことで、今回はハッシュとシンボルについて見ていきました。
ハッシュについてはキーと値でJavaで言うところのMapみたいなものかなと思いながら見ていったので親しみやすかったですが、シンボルについてはJavaでは見たことない?オブジェクトだったので新鮮でした。
しかし、文字列のように使用できるのに文字列よりも高速でしかもメモリを圧迫しないと言うのはとても便利だと思います!

次のテーマは正規表現です。
正規表現は使いこなせれば強力な武器になるとは思ってはいるんですが、なかなか本格的に勉強できていない分野です…
これを機会に正規表現をマスターして業務でもどしどし活用していきたいと思います!