さらなる高みへ -higher ground -

プログラミング学習の定着を狙いとしたアウトプット(独り言)をしてみるブログ

ハッシュを使って情報を整理する

今回覚えることは、①ハッシュを作れるようになること②ハッシュから情報を取得できること③ハッシュに情報を追加できることの3点である。

今回作成しているレビューアプリであるが、レビューが蓄積すると変数が増えるという問題が発生する。

それだけ記述も増えていき、見づらい、メンテナンスしにくい、そもそも記述量が半端じゃなくなってくるなどという問題が発生する。

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

ハッシュオブジェクト

ハッシュオブジェクト(略称:ハッシュ)はオブジェクトを複数保管できるオブジェクトである。
つまり、情報にキーを紐づけて保管できる箱のようなものである。

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

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

キーバリューストア

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

Hash

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

まずはハッシュオブジェクトを生成を行う。

hash = {}

ハッシュは{} を使って記述する。
また左辺のhashは変数名であり、任意の名前を定義できる。

上の書き方では何もデータを持っていない空のハッシュが生成される。
生成のときからデータを持つこともできる。

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

  hash1 = {"title" => "NEVER END"} #キーを文字列"title"で指定
  hash2 = {:title => "Too many people"} #シンボルというオブジェクト(キーが:title)
  hash3 = {title: "Scene"} #hash2と同義だが記述が少ないパターン
  puts hash1
  puts hash2
  puts hash3

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

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

シンボルオブジェクト

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

ハッシュオブジェクトのキーは文字列オブジェクト、シンボルオブジェクトのどちらを使っても問題はないのだが、どちらを使えばいいのかというと…

結論はハッシュではシンボルを使うべきということである。

ハッシュで使う場合に実行の速度がシンボルの方が速いため、ハッシュのキーにはシンボルの使用が推奨されている。

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

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

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

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

hash = {title:  "NEVER END"}
puts hash[:title]
hash[:title] = "Too many people"
puts hash[:title]

2つ目のputsではToo many peopleに上書きされる。

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

最後にこのハッシュを使ってレビュー情報をまとめるプロセスに入る。
①まず、レビューの投稿を表す変数をハッシュオブジェクトpostで生成する。

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

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

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

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

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

  post = {} # 空のハッシュの宣言

  #以下で要素の追加
  post[:genre] = "J-Pop"
  post[:title] = "NEVER END"
  post[:review] = "めっちゃいい"
  puts post # => {:genre=>"J-Pop", :title=>"NEVER END", :review=>"めっちゃいい"}

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

  puts post[:genre] # => "J-Pop"
  puts post[:title] # => "NEVER END"
  puts post[:review] # => "めっちゃいい!"

最後にここまでのコードのまとめを記録しておく。

# 変数の定義
post
= {} puts "ジャンルを入力してください:" post[:genre] = gets.chomp puts "タイトルを入力してください:" post[:title] = gets.chomp puts "感想を入力してください:" post[:review] = gets.chomp line = "---------------------------" # レビューの描画 puts "ジャンル : #{post[:genre]}\n#{line}" puts "タイトル : #{post[:title]}\n#{line}" puts "感想 :\n#{post[:review]}\n#{line}"