LoginSignup
0
0

More than 5 years have passed since last update.

Array#compact, Hash#compact

Last updated at Posted at 2018-03-25

Array#compactHash#compactはいずれも値がnilだったらそれを弾いた配列またはハッシュを返してくれるメソッド。(ruby2.4から入ったメソッド?)

["a", nil, "b"].compact #=> ["a","b"]
{a: 'hoge', b: nil, c: 'fuga'}.compact #=> {:a => 'hoge', :c => 'fuga'}
["a", nil, "b"].compact! #=> ["a","b"]
{a: 'hoge', b: nil, c: 'fuga'}.compact! #=> {:a => 'hoge', :c => 'fuga'}

["a", "b"].compact! #=> nil
{a: 'hoge', c: 'fuga'}.compact! #=> nil

# 当たり前だけど全部nilだったら、空を返す
[nil, nil, nil].compact! #=> []

遭遇した利用用途

とあるメソッドの処理途中で、別メソッドの返り値に配列が返ってきて、その配列の中身が無かったら(array.empty?)次の処理を中断するみたいな処理があった。
でも、この返り値に配列の中身は全てnilになる可能性もあったことが後から分かる
つまり[nil, nil, nil]みたいな状態。これ、[nil, nil, nil].empty?ってしても、falseが返ってしまうので、配列の中身が空ということを判定できない。。。
そこでcompact!

array = Class.hoge #=> なんか配列返すメソッド
array.compact! #=> ここでnilがあったら、nilを弾く
fuga(array) unless array.empty? # 配列が空じゃなければ、引数に渡して実行

こんな感じ。[nil,nil,nil]だったら、[]になるわけ。
nilを許容している配列とかハッシュを扱う時に、nilが値に入って良いのか確認して、ダメそうならこのメソッドで弾けそう!!便利!!!と思ったので備忘録

参考資料

るりま

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0