実例
配列に含まれる各要素の文字列が 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
を返すか?
上記の理由は以下の記事に大変わかりやすく書いてあります。
対処方法
それでは、もし「空」の配列が渡ってきた場合には false
を返したい場合はどう書けばいいのでしょうか。
愚直に以下のように書くのがいいと思います。
result = !input_array.empty? && input_array.all? { |element| element.start_with?('hoge-') }
Rails(ActiveSupprot)ならば !input_array.empty?
の箇所は input_array.present?
で良いでしょう。