こんにちは。あがさんです!!
アプレンティスへの参加を機に定期的に記事を投稿していきます。
どうぞよろしくお願いいたします。
ただの感想文になるかも...
Rubyを学習していて
Rubyを学習をしていく中で、理解しているつもりでも全然理解していなかったところを記事にして再確認していきます。今回はハッシュについてです。
データの受け渡しに関わるコードを書いているとぶち当たる内容ですよね〜。
このあと簡単なコードで仕組みや振る舞いを再確認していきたいと思います!!
ハッシュってなに?
ハッシュはキー(key)と値(value)の組み合わせでデータを管理するオブジェクトのことです
ash_sample = {}
hash_sample = {"key_a" => 1, "key_b" => 2, "key_c" => 3}
p hash_sample # => {"key_a"=>1, "key_b"=>2, "key_c"=>3}
p hash_sample.class # => Hash ・・・ Hashというクラスになっている
p hash_sample.length # => 3
興味深いのがp hash_sample.length
の結果が3
であることからキーと値が一対であることがわかります。
あれこれ確認してみる
番号と文字列のペアを配列のみで管理する場合は、配列の中に配列を作る連想配列が手段の一つに挙げられます。学習初期の私は外側の配列のインデックスを指定して、内側の配列のインデックスを指定するという味気ない方法しか知りませんでした。
gw_array = [[1, "Heero"],[2, "Duo"],[3, "Trowa"],[4, "Quatre"],[5," Wufei"]]
p gw_array[0][0] # => 1
p gw_array[3][1] # => "Quatre"
上記の記述をhashの形式に書き換えるとこうなります!↓
gw_hash = { 1 => "Heero", 2 => "Duo", 3 => "Trowa", 4 => "Quatre", 5 => "Wufei"}
p gw_hash.keys #=> [1, 2, 3, 4, 5]
p gw_hash[1] #=> "Heero" ← キーに対応した値が出力
p gw_hash["Duo"] #=> nil ← 逆に値からキーを出力できないようです。。。
p gw_hash.values #=> ["Heero", "Duo", "Trowa", "Quatre", "Wufei"]
なんだかワンランク上のコードに見えて良き!
ハッシュのキーや値を出力する方法はいくつかあります。
※キーと値は一対となっていますが値からキーを出力できないようです。
gw_hash = { 1 => "Heero", 2 => "Duo", 3 => "Trowa", 4 => "Quatre", 5 => "Wufei"}
gw_hash_a = {2 => "Duo", 3 => "Trowa", 4 => "Quatre", 5 => "Wufei", 1 => "Heero",}
gw_hash_b = { 1 => "Duo", 2 => "Heero", 3 => "Trowa", 4 => "Quatre", 5 => "Wufei"}
p gw_hash == gw_hash_a #=>ture
p gw_hash == gw_hash_b #=>false
続いて要素の並び替えをしてみました。gw_hash_a
はキーと値はそのままに1 => "Heero"
を最後に配置しました。その後、元のgw_hash
と比較してみました。返り値はtrueとなるようです。
ただ、キーと値の組み合わせを変えたgw_hash_b
は流石にfalseとなるようですね..。
gw_hash = { 1 => "Heero", 2 => "Duo", 3 => "Trowa", 4 => "Quatre", 5 => "Wufei"}
gw_hash[6] = "Zechs"
p gw_hash #=>{1=>"Heero", 2=>"Duo", 3=>"Trowa", 4=>"Quatre", 5=>"Wufei", 6=>"Zechs"}
gw_hash[2] = "Duo Maxwell" #値の変更
p gw_hash.delete(1) #=> "Heero" を削除
p gw_hash #=> {2=>"Duo Maxwell", 3=>"Trowa", 4=>"Quatre", 5=>"Wufei", 6=>"Zechs"}
追加、編集、削除もこのように行うことができました。何回かコードを書いているとまた新たな発見があるかもしれません。他にも様々な記述方法があるようですが今回は割愛します!!
よく使いそうな処理
実際に便利だなと感じた処理を書いていきます。
gw_hash = { 1 => "Heero", 2 => "Duo", 3 => "Trowa", 4 => "Quatre", 5 => "Wufei"}
#eachメソッドで繰り返し処理
gw_hash.each do |key, value|
puts "#{key}: #{value}"
end
--------------
#出力結果
#1: Heero
#2: Duo
#3: Trowa
#4: Quatre
#5: Wufei
keyと値をセットにして出力できます。この処理は実際にコードを書いていく中ですごくお世話になりました。
まとめ
いかがでしたでしょうか。取り急ぎ書き綴った記事になりましたが、ハッシュについて自分が本当に最初の段階で覚えた内容から今回投稿してみようと思いました。他にはシンボルや配列に変換するなどいろんなことができるテーマだと感じました。頭がパンクしそうなので今回はこの辺にしておきたいと思います。それでは次回もお楽しみ〜!
~Qiitaの歴史がまた1ページ~
参考文献
・プロを目指す人のためのRuby入門(伊藤淳一 著)