Enumerable応用レベル
次のプログラムを実行するとどうなりますか?
amounts = [1000, 2000, 3000] selected = amounts.select! { |amount| amount >= 1000 } total = selected.sum p total
- 16000 と表示される
- 20 と表示される
- 3[] と表示される
- 4NoMethodError が発生する
解説
select! は破壊的に配列を絞り込みますが、1件も削除されず配列に変更がなかった場合は nil を返します。この例では全要素が amount >= 1000 を満たすため、selected は配列ではなく nil になります。そのため selected.sum は undefined method 'sum' for nil:NilClass の NoMethodError になります。