🪬

【Ruby超入門】ハッシュの基本

2019/12/10に公開

今回は Ruby でよく出てくるハッシュについて詳しく紹介していきます。

ハッシュは配列のように複数のデータを格納するオブジェクトですが、配列とは違うのでちゃんと理解して使用できるようにしましょう。

ハッシュとは

{"Ruby" => "Rails", "PHP" => "Laravel", "Python" => "Django"}

ハッシュとは複数のデータをまとめて格納できるオブジェクトです。
配列と似ていますが、「キー」と「値」のセットで複数のデータを扱います。

  • ハッシュは {} の中にカンマ区切りで「キー」と「値」の組を複数書いていく。
  • 「キー」の後に =>(ハッシュロケット)を書き、それに続いて「値」を記述する。
  • 中身が無い場合は空のハッシュができる。
  • 「キー」と「値」には種類の違うオブジェクトを入れられる。
  • 他の言語では連想配列などと呼んだりする。
  • ハッシュの「キー」と「値」はシンボルにできる。
  • シンボルが「キー」になる場合は => を省略できるが、 : が前後入れ変わる記述となる。
{"Ruby" => "Rails", "PHP" => "Laravel"}

# 「キー」をシンボルにして「=>」を省略
{Ruby: "Rails", PHP: "Laravel"}

# 「値」もシンボルにできる
{Ruby: :Rails, PHP: :Laravel}

ハッシュの基本的な使い方

「キー」と「値」を追加

ハッシュは「キー」と「値」を指定することで追加できます。

languages = {"Ruby" => "Rails", "PHP" => "Laravel"}

# Pythonを追加する
languages["Python"] = "Django"
#=> "Django"

p languages
#=> {"Ruby" => "Rails", "PHP" => "Laravel", "Python" => "Django"}

「変数(languages)」の「キー(Python)」に、「値(Django)」を代入するようなイメージです。

追加した「キー」と「値」の組は末尾に追加されますが、ハッシュでは「キー」を指定して「値」を代入したり取得したりする使い方が多いため、順番を意識することはあまりありません。

また、すでに存在する「キー」を指定した場合は「値」が上書きされます。

languages = {"Ruby" => "Rails", "PHP" => "Laravel"}

# すでに存在するPHPを指定
languages["PHP"] = "CakePHP"
#=> "CakePHP"

p languages
#=> {"Ruby" => "Rails", "PHP" => "CakePHP"}

ハッシュから「値」を取り出す

ハッシュは「キー」を指定することでその「値」を取り出すことができます。

languages = {"Ruby" => "Rails", "PHP" => "Laravel"}

puts languages["Ruby"]
#=> Rails

配列では[n]というように n 番目の要素取り出していましたが、ハッシュはインデックス番号ではなく「キー」を指定することで、組となっている「値」を取得します。

存在しない「キー」を指定すると nil を返します。

languages = {"Ruby" => "Rails", "PHP" => "Laravel"}

puts languages["JavaScript"]
#=> nil

ハッシュから「キー」と「値」の組を削除

ハッシュから「キー」と「値」の組を削除するときは delete メソッドを使います。

指定した「キー」がなければ nil を返します。

languages = {"Ruby" => "Rails", "PHP" => "Laravel"}

puts languages.delete("PHP")
#=> Laravel

p languages
#=> {"Ruby" => "Rails"}

puts languages.delete("PHP")
#=> nil

要素数の取得

size メソッドを使うとハッシュの要素の個数を調べることができます。

hash = {}
puts hash.size
#=> 0

hash = {"x" => 1, "y" => 2, "z" => 3}
puts hash.size
#=> 3

size メソッドは length メソッドのエイリアスなので、length メソッドを使用しても要素の数を取得できます。

hash = {"x" => 1, "y" => 2, "z" => 3}
puts hash.length
#=> 3

ハッシュを使った繰り返し処理

each メソッドを使うと「キー」と「値」の組み合わせを格納した順に取り出すことができます。

languages = {"Ruby" => "Rails", "PHP" => "Laravel"}

languages.each do |key, value|
  puts "#{key} : #{value}"
end

#=> Ruby : Rails
#=> PHP : Laravel

each は配列でも使うので、以下の記事も参考にしてください。

https://zenn.dev/yyykms123/articles/2020-01-14-ruby-array-methods

配列の each と違って、ブロック引数が「キー」と「値」の 2 つになっている点に注意しましょう。

each ではブロック引数を 1 つにできて、この場合は「キー」と「値」が配列に格納されます。

languages = {"Ruby" => "Rails", "PHP" => "Laravel"}

languages.each do |key_value|
  key = key_value[0]
  value = key_value[1]
  puts "#{key} : #{value}"
end

#=> Ruby : Rails
#=> PHP : Laravel

ハッシュの同値比較

== でハッシュ同士を比較すると、同じハッシュかどうかをチェッできますす。

すべての「キー」と「値」が同じであれば true が返ります。

並び順が異なっていてもすべての「キー」と「値」が同じであれば true が返ります。

a = {"x" => 1, "y" => 2, "z" => 3}
b = {"x" => 1, "y" => 2, "z" => 3}
c = {"z" => 3, "x" => 1, "y" => 2}
d = {"x" => 1, "y" => 20, "z" => 3}

# 同じなのでtrue
puts a == b  #=> true

# 順番は違うが、同じなのでtrue
puts a == c  #=> true

# 同じではないのでfalse
puts a == d  #=> false

まとめ

以上がハッシュの使い方の紹介でした。

配列と同じように複数のデータを扱いますが、ハッシュは「キー」と「値」がセットです。

ハッシュはとてもよく使用するので、しっかり使えるようになりましょう。

参考書

Discussion