Ruby で Array.all? で判別する際には Array が [] でも true が返ってくる

実例

配列に含まれる各要素の文字列が hoge- で始まっているかどうかを判別するコードを書きます。全ての要素が hoge- で始まっている場合には true が返ってくるコードを書くことを目的とします。

例1

まずは次のようなコードです。この戻り値は true で期待どおりです。

example_a = ['hoge-foo', 'hoge-bar', 'hoge-fuga']
result = example_a.all? { |element| element.start_with?('hoge-') }
p result #=> true

例2

次のようなコードの場合は false が返ってきて、これも期待どおりです。

example_b = ['ahoge-foo', 'hoge-bar', 'hoge-fuga']
result = example_b.all? { |element| element.start_with?('hoge-') }
p result #=> false

例3

それでは、チェックする配列が「空」の場合はどうなるかというと、これは true が返ってきます。この戻り値は直感に反する戻り値かもしれません。

exmaple_c = []
result = example_c.all? { |element| element.start_with?('hoge-') }
p result #=> true

なぜ「空」の配列に対して all?true を返すか?

上記の理由は以下の記事に大変わかりやすく書いてあります。

qiita.com

対処方法

それでは、もし「空」の配列が渡ってきた場合には false を返したい場合はどう書けばいいのでしょうか。

愚直に以下のように書くのがいいと思います。

result = !input_array.empty? && input_array.all? { |element| element.start_with?('hoge-') }

Rails(ActiveSupprot)ならば !input_array.empty? の箇所は input_array.present? で良いでしょう。

Powered by はてなブログ