Ruby力をつけるための基礎固めとして、Hashについて整理します。※たのしいRubyから
Hashの作り方
{ キー => 値 }
h1 = {"a" => "b", "c" => "d"}
{ キー: 値 }
h2 = {a: "b", c: "d"}
シンボルと文字列の違いは別の人が解説してくれるはず...
Hash.new
# 引数なし
h1 = Hash.new
p h1["hogehoge"] #=> nil
# 引数あ
h2 = Hash.new("")
p h2["hogehoge"] #=> ""
値を取り出す, 設定する
h = Hash.new
h["R"] = 'Ruby'
p h #=> "Ruby"
h = Hash.new
h.store("R", "Ruby")
p h.fetch("R") #=> "Ruby"
fetchで取得するときの動きの違い
# 例外が発生する
h = Hash.new
p h.fetch("N") #=> エラー(IndexError)
# 第2引数を指定すれば、キーがない場合のデフォルト値になる
h = Hash.new
p h.fetch("N", "Nothing Value") #=> "Nothing Value"
# 引数にブロックを渡すと実行結果が得られた値がデフォルト値になる
h = Hash.new
p h.fetch("N") { String.new } #=> ""
まとめて取り出す
h = { "a" => "b", "c" => "d" }
p h.keys #=> ["a", "c"]
p h.values #=> ["a", "c"]
p h.to_a #=> [["a", "b"], ["c", "d"]]
デフォルト値
ブロックを指定する
h = Hash.new do |hash, key|
hash[key] = key.upcase
end
h["a"]
p h #=> {"a"=>"A"}
キーや値があるか確認する
h.key?(key)
h.has_key?(key)
h.include?(key)
h.member?(key)
使い方と動作は同じなので、どれか使えばOK
h = { "a" => "b", "c" => "d" }
p h.key?["a"] #=> true
h.value?(value)
h.has_value?(value)
使い方と動作は同じなので、どれか使えばOK
h = { "a" => "b", "c" => "d" }
p h.value?["b"] #=> true
ハッシュの大きさ
h.length
h.size
使い方と動作は同じなので、どれか使えばOK
h = { "a" => "b", "c" => "d" }
p h.length #=> 2
p h.size #=> 2
h.empty?(value)
h = { "a" => "b", "c" => "d" }
p h.empty? #=> false
h = Hash.new
p h.empty? #=> true
キーと値を削除する
h.delete(key)
h = { "a" => "b", "c" => "d" }
p h["a"] #=> "b"
h.delete("a")
p h["a"] #=> nil
# ブロック使った場合
h.delete("a"){ |key| "no #{key}." } "no a."
h.delete_if {key, val} ...}
h.regect! {key, val} ...}
条件を与えてそれに該当するものだけを削除
h = { "a" => "b", "c" => "d" }
# delete_if
h.delete_if{|key, value| key == "L"} #=> {"a"=>"b", "c"=>"d"}
h.delete_if{|key, value| key == "a"} #=> {"c"=>"d"}
# regect! 該当keyがなかったらnil
h.reject!{|key, value| key == "L"} #=> nil
h.reject!{|key, value| key == "a"} #=> {"c"=>"d"}
ハッシュを初期化する
h.clear
h = { "a" => "b", "c" => "d" }
h.clear #=> {}
h = { "a" => "b", "c" => "d" }
h2 = h
h.clear
p h2 #=> {}
h = { "a" => "b", "c" => "d" }
h2 = h
h = Hash.new
p h2 #=> { "a" => "b", "c" => "d" }