【Ruby】ハッシュの基礎をまとめてみた!

rails

こんにちは!tekute-kuです。

今回はプログラミングを勉強していたら必ず出てくるハッシュについてまとめてみました。

この記事を書いた目的

ハッシュはプログラミングを勉強していたら必ず出てくる内容です。理解していないと先に進めないので自分の備忘録としてまとめてみました。この記事が誰かのお役に立てれば幸いです。

ハッシュとは

まずはハッシュとは何なのでしょうか。

ハッシュとはキーと値の組み合わせをセットにして、複数のデータを管理することができる便利なオブジェクトのことを言います。

英語で書くと「Hash」。「寄せ集め、ごた混ぜ、(文字列)などを値に変換する」などの意味があるようです。

ハッシュは本質的には配列と同じですがインデックスとして整数値以外のものも使える点が配列と異なると言えそうです。

言い方を変えると「ハッシュは数字以外の文字列などをインデックスとして使うことができる配列みたいなもの」といったところでしょうか。

またハッシュの場合はインデックスをキーと呼びますので下のようになります。

{“キー”=>”値”, “キー”=>”値”}

ハッシュはキーと値のペアを{ }で囲んで表記します。

と言うわけでハッシュを理解するためには、まずは配列を理解しなければならないようですので配列を理解していない場合はこちらを先にご覧ください!

ハッシュの書き方

はてさて、言葉だけで言われてもチンプンカンプンですので実際に書いてみてみましょう。

user = {} #ハッシュを定義するときは{}を使用する
=> {}
user["名前"] = "太郎" #userの"名前"を太郎と定義
=> "太郎"
user["年齢"] = "19" #userの"年齢"を19と定義
=> "19"
user #定義完了
=> {"名前"=>"太郎", "年齢"=>"19"}
user["名前"] #userの"名前"を呼び出す
=> "太郎"

上の例でいくと”名前”が配列でいうところのインデックス、”名前”の値が”太郎”とういうことになります。

{“インデックス”=>”値”, “インデックス”=>”値”}

ハッシュの場合はインデックスをキーと呼ぶので

{“キー”=>”値”, “キー”=>”値”} となります。

ちなみに => の記号はハッシュロケットと呼びます

ハッシュを定義するときは[ ]角カッコを使って定義します。

user = {} #空のハッシュを定義
=> {}
user["キー"] = "値"
=> "値" 
user => {"キー"=>"値"}

他にも下のように{ }波カッコと=>ハッシュロケットを使って定義することもできます。この方が簡単に定義できますね。

user = {"名前"=>"太郎", "年齢"=>"19"}
=> {"名前"=>"太郎", "年齢"=>"19"}

キーにシンボルを使う

ここまではハッシュのキーに文字列を使っていましたがここからはキーにシンボルを使ってみます。

Railsではハッシュのキーに文字列ではなくシンボルを使うのが一般的です。

シンボルの使い方

シンボルとは文字列と似ていますが、クォートで囲まれる代わりにコロンが前に置かれます。

“name” ⇨ 文字列

:name ⇨シンボル

実際にシンボルを使ってハッシュを定義してみます。

user = {:名前=>"太郎",:年齢=>"19"}
=> {:名前=>"太郎",:年齢=>"19"} 
user[:名前] #呼び出し方は変わらない 
=> "太郎"

ハッシュを定義する方法と呼び出し方法は文字列の時と変わりませんね。

シンボルに使用できない文字もある

シンボルには使用できない文字もありますので注意が必要です。

user = {:名前-=>"太郎",:年齢=>"19"} #シンボルに-マイナスをつける
SyntaxError: unexpected tOP_ASGN, expecting 
user = {:1名前=>"太郎",:年齢=>"19"} #シンボルの先頭に1をつける 
SyntaxError: unexpected tINTEGER, expecting tSTRING_CONTENT or tSTRING_DBEG or tSTRING_DVAR or tSTRING_END

 

このように使用できない文字を使うとエラーが発生してしまいます。

シンボルを使ったもう一つのハッシュの定義方法

ハッシュを定義する場合、シンボルを使うことが一般的なのでRuby 1.9から別の記法がサポートされるようになりました。

user = {名前:"太郎",年齢:"19"}
=> {名前:"太郎",年齢:"19"}

シンボルとハッシュロケットの組み合わせを、次のようにキーの名前の (前ではなく) 後にコロンを置き、その後に値が続くように置き換えたものです。

{名前:"太郎",年齢:"19"}

この記法の方がより簡単にハッシュを定義できますね。

ですが最初にやった記法と見分けがつきづらいのでどちらのの記法もマスターしておくことが必要ですね。

{:名前=>"太郎",:年齢=>"19"}
{名前:"太郎",年齢:"19"}

上の2つの記法で定義されるハッシュのデータ構造は全く同じになります。

ハッシュの中のハッシュ

ハッシュの値にはほぼ何でも使うことができます。

特によく使われるのが、ハッシュの中にあるハッシュです。

以下の例ではハッシュの中にハッシュを定義したものになります。

params = {} #paramsに空のハッシュを定義する
=> {}
params[:user] = {名前:"太郎",年齢:"19"} #シンボル:userにハッシュを定義する
=> {:名前=>"太郎", :年齢=>"19"}
params #ハッシュの中にハッシュが入っている
=> {:user=>{:名前=>"太郎", :年齢=>"19"}}

このようにハッシュの中にハッシュも定義することができます。

呼び出し方法は以下の通りです。

params #上の続き
=> {:user=>{:名前=>"太郎", :年齢=>"19"}}
params[:user] #:userを呼び出す
=> {:名前=>"太郎", :年齢=>"19"}
params[:user][:名前] #:userの:名前を呼び出す
=> "太郎"

呼び出し方法は[ ]角カッコを使うのは変わりませんが、ハッシュの中のハッシュを呼び出す場合は[ ]角カッコを並べて使います。

ハッシュの中のハッシュはよく使いますので、呼び出し方法や構造を理解しておくと良いですね。

まとめ

  • ハッシュは配列と似ているが、インデックスの代わりにキーを使用する。
  • ハッシュは順番は関係ない。順番が重要であれば配列。
  • キーには文字列とシンボルを使用でき、一般的にはシンボルを使用する。
  • シンボルだと定義の方法が2つある。
  • ハッシュの中のハッシュ。

コメント