Array#compact
とHash#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が値に入って良いのか確認して、ダメそうならこのメソッドで弾けそう!!便利!!!と思ったので備忘録