【Ruby】初心者がるりまを読んで初めて知ったメソッドをまとめてみる～Hash～

最近るりまを読んでいるので、学習したメソッドから有用そうなものをまとめていこうと思います
たのしいRubyを読み終わったあたりの初心者が対象の記事です

以前紹介したものと似たようなメソッドは省略しているので、前の記事も是非

#Hashクラス
###self == other -> bool
`self`と`other`が等しいか判定する演算子
キーを`eql?`で、値を`==`で比較して、全て等しい要素を持つ場合`true`を返す

※2つのハッシュが比較されるとき、キーを`eql?`で、値を`==`で判定することが多いので覚えておくと便利
※比較に順番は考慮されないので、考慮したい場合は [to_a](https://docs.ruby-lang.org/ja/latest/method/Hash/i/to_a.html) を使うとよし

~~~Ruby
hash = {a: 1, b: 2}
hash2 = {b: 2, a: 1}

hash == hash2           #=> true
hash.to_a == hash2.to_a #=> false
~~~

###self > other -> bool
`other`が`self`のサブセット(一部的な意味)である場合`true`を返す

~~~Ruby
hash  = {a: 1, b: 2, c: 3}
hash2 = {a: 1, b: 2}

hash > hash2 #=> true
~~~

ハッシュの比較演算子は他にも [<](https://docs.ruby-lang.org/ja/3.0.0/method/Hash/i/=3c.html), [<=](https://docs.ruby-lang.org/ja/3.0.0/method/Hash/i/=3c=3d.html), [>=](https://docs.ruby-lang.org/ja/3.0.0/method/Hash/i/=3e=3d.html) がある

###key?(key) -> bool
`self`に`key`をキーとする要素がある場合`true`を返す

値を検索する [value?](https://docs.ruby-lang.org/ja/3.0.0/method/Hash/i/value=3f.html) もある

###fetch(key, default = nil) {|key| ... } -> object
`key`に関連付けられた値を返す

キーが`self`に登録されていない場合、
1. 第二引数を与えているとその値を返す
2. ブロックを与えていると`key`をブロック変数としてブロックを評価しその戻り値を返す
3. どちらもなければ例外発生

という挙動を(デフォルト値を無視して)取る

ハッシュは配列と違い、存在しないキーを指定しても常にデフォルト値を返すので、基本`[]`でなくこのメソッドを使った方がいい

`key`を複数指定して配列で値を返す [fetch_values](https://docs.ruby-lang.org/ja/3.0.0/method/Hash/i/fetch_values.html) もある

###keys -> [object]
全てのキーの配列を返す

値の配列を返す [values](https://docs.ruby-lang.org/ja/3.0.0/method/Hash/i/values.html) もある

###slice(*keys) -> Hash
`self`から`keys`に対応する要素だけを抜き出したハッシュを返す

~~~Ruby
hash = {a: 1, b: 2, c: 3}

hash.slice(:a, :b) #=> {:a=>1, :b=>2}
~~~

対応しない要素だけを抜き出す [except](https://docs.ruby-lang.org/ja/3.0.0/method/Hash/i/except.html) もある

###assoc(key) -> Array | nil
`key`をキーとして持つ要素をキーと値のペアの配列として返す

~~~Ruby
hash = {a: 1, b: 2}

hash.assoc(:a) #=> [:a, 1]
~~~

値を検索する [rassoc](https://docs.ruby-lang.org/ja/latest/method/Hash/i/rassoc.html) もある

###flatten(level = 1) -> Array
`self`を平坦化した配列を返す

~~~Ruby
hash = {a: 1, b: [2, 2.0]}

hash.flatten #=> [:a, 1, :b, [2, 2.0]]
~~~

`level`のデフォルト値が1なので引数を与えないと上記の様になるが、-1を与えると完全に平坦化してくれる

~~~Ruby
hash = {a: 1, b: [2, 2.0]}

hash.flatten(-1) #=> [:a, 1, :b, 2, 2.0]
~~~

###invert -> Hash
キーと値を反転したハッシュを返す
重複する値があった場合、最後に定義されたものが使用される

~~~Ruby
hash = {a: 1, b: 2, c: 3, d: 3}

hash.invert #=> {1=>:a, 2=>:b, 3=>:d}
~~~

###merge(*others) -> Hash
`self`と`others`を結合した配列を返す

キーが重複する要素があったときは
1. ブロックが与えられていれば`key`, `selfの値`, `otherの値`を変数としてブロックを評価してその戻り値を使用する
2. `other`の値を使用する

という挙動になる

破壊的である `merge!` もある

###to_h -> self | Hash
`self`を返す

ブロックを与えるとキーと値を変数としブロックを評価し、戻り値の配列をペアとして使う（平たく言うとハッシュの`map`）

~~~Ruby
hash = {a: 1, b: 2}

hash.to_h { |k, v| [k, v * 10] } #=> {:a=>10, :b=>20}
~~~

###transform_keys {|key| ... } -> Hash
すべてのキーをイテレートして、ブロックの戻り値でキーを書き換えたハッシュを返す（キーの`map`）

※対応表的なハッシュを引数として与えることもできます

~~~Ruby
hash = {a: 1, b: 2}

hash.transform_keys { |k| k.to_s }     #=> {"a"=>1, "b"=>2}
hash.transform_keys({a: "a", b: "bb"}) #=> {"a"=>1, "bb"=>2}
~~~

値の`map`である`transform_values`や、破壊的である`trasform_keys!`と`transform_values!`もある

#最後に
るりまをよむのはいいぞ。（るりまおじさん）
表現力が上がり、メソッドの詳しい挙動が知れることもあり、良い事づくめです
紹介してないメソッドも沢山あるのでぜひ

実際に使うことで覚えていくのも重要です

#シリーズ

- [【Ruby】初心者がるりまを読んで初めて知ったメソッドをまとめてみる～Array～](https://qiita.com/porryanes/items/640e76e71ce157bebf72)
- 【Ruby】初心者がるりまを読んで初めて知ったメソッドをまとめてみる～Hash～ <=ここ