hiyoko-programingの日記

プログラミングを勉強したてのひよっ子。   エンジニア目指して勉強中。

ハッシュ

ハッシュという複数の情報を扱うことのできるオブジェクトをつかってレビューの情報をより分かりやすく扱う。

変数が増えるという問題

これまでのソースコードを見てみるとジャンル、タイトル、感想をそれぞれ別の変数として扱っていた。
しかし、レビューを複数扱う場合を考えてみる。
例えば以下の2つのレビューを同時に表示させるプログラムを書いてみる。


  • ジャンル 映画
  • タイトル 時をかける少女
  • 感想 人生の最高傑作アニメ。 ***
  • ジャンル マンガ
  • タイトル るろうに剣心
  • 感想 映画化されたけど、やっぱり原作が最高。 ***
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
  # レビュー1
  genre1  = "映画"
  title1  = "時をかける少女"
  review1 = "人生の最高傑作アニメ。"
  # レビュー2
  genre2  = "マンガ"
  title2  = "るろうに剣心"
  review2 = "映画化されたけど、やっぱり原作が最高。"
  # 区切り線
  line   = "---------------------------"

  # レビューの描画
  puts "ジャンル : #{genre1}"
  puts "タイトル : #{title1}"
  puts "感想 :\n#{line}\n#{review1}\n#{line}\n"

  puts "ジャンル : #{genre2}"
  puts "タイトル : #{title2}"
  puts "感想 :\n#{line}\n#{review2}\n#{line}"

同じような変数が増えていっている。さらにジャンル、タイトル、感想以外にも項目が増えたときにどんどん変数が多くなって見づらくなっていきそう。

 

そこで出てくるのががハッシュオブジェクト

ハッシュとは

 ハッシュオブジェクト

ハッシュオブジェクト(略称:ハッシュ)は1つの変数で複数のデータを持つことのできるオブジェクト。

ハッシュオブジェクトは、自身の中にデータとそれに対応するキーのセットを所持することができる。

作成中のレビューアプリでは、ハッシュオブジェクトを利用しレビューのまとまりを作ることで、あとからレビューを読む時などの処理を簡単に記述できるようになる。

 

 キーバリューストア

ハッシュのように、保存したいデータ(バリュー)とそれに対応する標識(キー)を対応させてペアで保存する方式のことをキーバリューストアという。標識であるキーを指定すればそれに対応するデータを取り出すことが可能。

Hash

 

要点チェック

 

ハッシュオブジェクトの変数を作る

ハッシュの生成は以下のコードで行える。

1
  hash = {}

ハッシュは{} (中括弧)を使って記述する。また左辺のhashは変数名であり、任意の名前を定義できる。上の書き方では何もデータを持っていない空のハッシュが生成される。

生成のときからデータを持つこともできる。以下の書き方でキーと値を持った状態のハッシュオブジェクトを生成できる。
{キー1 => 値1, キー2 => 値2, ...} 

ターミナル
1
2
3
$ ruby -v
#Rubyのバージョンが表示される
2.0.0
sample.rb
1
2
3
4
5
6
  hash1 = {"title" => "るろうに剣心"}
  hash2 = {:title => "時をかける少女"}
  hash3 = {title: "君に届け"}
  puts hash1
  puts hash2
  puts hash3
  

hash1hash2はどちらも「title」というキーでハッシュを生成している。hash1はキーを文字列"title"で指定している。一方、hash2はキーが:titleとなっている。これはシンボルと呼ばれるオブジェクト。

また、hash3hash2と同義だが、コードの量が少なく好んで使われる。

先ほどRubyのバージョンを確かめたのは、hash3の記法はRubyのバージョン1.9.3以降からしか使えないため。それ以前のバージョンで利用しようとすると、エラーが起きてしまう。

 シンボルオブジェクト

シンボルオブジェクト(略称:シンボル)とは今回のハッシュのキーのような名前を識別するためのラベル。
基本的に先頭に接頭語:をつける。基本的には文字列と同じように扱える。

ハッシュオブジェクトのキーは文字列オブジェクト、シンボルオブジェクトのどちらを使っても問題ない。

 

要点チェック

 

文字列とシンボルのどっちを使えば良いのか?

結論から言うとハッシュではシンボルを使う。文字列とシンボルはほとんど特性は同じ。ハッシュのキーも文字列とシンボルの両方が使える。

1
2
3
  # どちらも同じ
  hash1 = {:title => "時をかける少女"}
  hash2 = {"title" => "時をかける少女"}

しかし、ハッシュで使う場合に実行の速度がシンボルの方が早いため、ハッシュのキーにはシンボルの使用が推奨されている。
(文字列とシンボルは特性は実は少しだけ違う。こちらのサイトなどが参考。http://qiita.com/Kta-M/items/53a13ef60e14fcb41193)

 

要点チェック

 

ハッシュオブジェクトから値を取得する

取得の際に使うのがその値のキー。以下の書き方で取得ができる。

1
  ハッシュオブジェクト[欲しい値のキー]
sample.rb
1
2
  hash = {title:  "時をかける少女"}
  puts hash[:title]

 

要点チェック

 

ハッシュオブジェクトに値を追加する

もちろんハッシュオブジェクトは生成後にも値を追加できる。追加には以下のような書き方をする。

1
  ハッシュオブジェクト[キー] = 

すでに値が入っているキーを指定すると値が上書きされる
キーが「title」、それに対応する値が「時をかける少女」のハッシュオブジェクトを作り、キー「title」に対応する値を上書きして変える。

sample.rb
1
2
3
4
  hash = {title:  "時をかける少女"}
  puts hash[:title]
  hash[:title] = "るろうに剣心"
  puts hash[:title]

 

要点チェック

 

ハッシュでレビューの情報をまとめる

レビューの投稿を表す変数をハッシュオブジェクトpostで生成する。

1
  post = {}      # レビューの投稿を表す変数を定義

そして、今まで変数としていた「genre」、「title」、「review」をそれぞれハッシュオブジェクトpostのキーとする。

1
2
3
  post[:genre]  = # ジャンル
  post[:title]  = # タイトル
  post[:review] = # 感想

これで今まで3つあった変数(genre,title,review)はpostの1つだけにすることができる。

例えば、具体的にハッシュの中に要素を追加してみる。
まず空のハッシュを宣言することで、後からハッシュの要素を追加出来るようになる。

1
2
3
4
5
6
7
  post = {} # 空のハッシュの宣言

  #以下で要素の追加
  post[:genre] = "マンガ"
  post[:title] = "るろうに剣心"
  post[:review] = "面白い!"
  puts post # => {:genre=>"マンガ", :title=>"るろうに剣心", :review=>"面白い"}

また、以下のように定義したハッシュを使うことが出来る。

1
2
3
  puts post[:genre] # => "マンガ"
  puts post[:title] # => "るろうに剣心"
  puts post[:review] # => "面白い!"