「【Ruby入門】ハッシュとシンボルの基本」にて、ハッシュの基本を解説しました。そこで本記事ではそれに続き、より実践的なハッシュの使い方について解説します。
ハッシュに値をセットしたあと、それをどう使うか(つまりどうやって取り出すか)が問題となります。
ハッシュもオブジェクトです。となると、配列と同じようにハッシュもeachメソッドが使えます。ハッシュ.eachで取り出すことが可能です。本記事ではその方法を解説します。
その他、本記事ではハッシュから配列とその逆への変換、ハッシュの入れ子(ハッシュの中にハッシュ)、ハッシュの便利な表示方法を解説します。
なお、一般的にハッシュのキーにはシンボルを使います。本記事でもそれに従い、キーはすべてシンボルを使います。シンボルとは何?とお忘れの方は、冒頭のリンクより前の記事を開き、読みなおすことをおすすめします。
ハッシュをeachで取り出す
冒頭でふれたように、配列で出てきたeachですが、ハッシュにも使えます。
[書式]
ハッシュ.each do | key, value | (keyとvalueを使った何らかの処理) end
配列のeachと異なり、キーと値を取り出さなくてはいけないので、ブロック変数はkeyとvalueの2つになります。
hash = {user1: "ユーザー1", user2: "ユーザー2"} hash.each do |key, value| puts "key:" + key.to_s + " value:" + value end
[実行結果]
key:user1 value:ユーザー1 key:user2 value:ユーザー2
ブロック変数「|key, value|」で取り出せるのですが、putsで表示するときは文字列に変換しなくてはなりません。よって上記プログラムではキーに.to_sメソッドを使って文字列に変換しています。
今度は、式展開を使って内容を表示させてみましょう。
hash = {user1: "ユーザー1", user2: "ユーザー2"} hash.each do |key, value| puts "key: #{key} value: #{value}" end
先ほどと同じ結果が得られます。
式展開を使うとto_sが必要ないことも注目してください。
キーを指定して削除する
要素を削除するときは、deleteを使います。
hash = {user1: "ユーザー1", user2: "ユーザー2"} hash.delete(:user1) puts hash
[実行結果]
{:user2=>"ユーザー2"}
:user1を削除できました。
条件を指定して削除することも可能です。
hash = {user1: "ユーザー1", user2: "ユーザー2"} puts hash.delete_if{|key, value| key == :user1}
[実行結果]
{:user2=>"ユーザー2"}
条件をブロックで渡して、満たすものだけ削除できました。
ハッシュから配列、その逆
to_aメソッドやto_hメソッドを使い、ハッシュから配列、配列からハッシュへ相互に変換する方法を解説します。
まずはハッシュから配列への変換です。
hash = {user1: "ユーザー1", user2: "ユーザー2"} p hash.to_a
[実行結果]
[[:user1, "ユーザー1"], [:user2, "ユーザー2"]]
一体何が起こったのかお分かりでしょうか?
1つの大きい配列に、2つの小さい配列が入れ子で入っています。つまり、ハッシュのキーと値をセットとした、1つの小さな配列になっています。
ハッシュを配列にできるのなら、逆の考え方もできますよね。
つまり、配列の入れ子をハッシュにできそうです。
やってみましょう。
array = [[:user1, "ユーザー1"], [:user2, "ユーザー2"]] p array.to_h
[実行結果]
{:user1=>"ユーザー1", :user2=>"ユーザー2"}
先ほどの実行結果をそのまま使い配列を作成し、to_hメソッドでハッシュ化できました。
ハッシュの中にハッシュ
もっと複雑なハッシュを見てみましょう。ハッシュの中にハッシュを入れることも可能です。
例えば、以下のような構成を考えます。
人事:HR 社員1(emp1) 田中(tanaka) 社員2(emp2) 佐藤(sato) 販売:SL 社員3(emp3) 鈴木(suzuki) 社員4(emp4) 高橋(takahashi)
これをハッシュで実装します。
hash = { HR: { emp1: "tanaka", emp2: "sato" }, SL: { emp3: "suzuki", emp4: "takahashi" } } puts hash
[実行結果]
{:HR=>{:emp1=>”tanaka”, :emp2=>”sato”}, :SL=>{:emp3=>”suzuki”, :emp4=>”takahashi”}}
ハッシュを多重で定義できました。
ppメソッド
ハッシュが複雑になると、putsメソッドやpメソッドで表示させても見づらいです。そんなときはppメソッドを使うと便利です。
先ほどの例を使います。
require "pp" hash = { HR: { emp1: "tanaka", emp2: "sato" }, SL: { emp3: "suzuki", emp4: "takahashi" } } pp hash
[実行結果]
{:HR=>{:emp1=>"tanaka", :emp2=>"sato"}, :SL=>{:emp3=>"suzuki", :emp4=>"takahashi"}}
ちょっとだけ見やすくなりました。
まとめ
本記事では、ハッシュの応用的な使い方を解説しました。
ぜひハッシュの考え方をマスターし、配列とハッシュのいずれを使うのか適切な判断ができるようになってくださいね!